共用方式為


CertFindCertificateInStore 函式 (wincrypt.h)

CertFindCertificateInStore 函式會在 證書存儲中尋找第一個或下一個 憑證內容, 符合 dwFindType 及其相關聯 pvFindPara所建立的搜尋準則。 此函式可在迴圈中使用,在符合指定尋找準則的 證書存儲中尋找所有 憑證

語法

PCCERT_CONTEXT CertFindCertificateInStore(
  [in] HCERTSTORE     hCertStore,
  [in] DWORD          dwCertEncodingType,
  [in] DWORD          dwFindFlags,
  [in] DWORD          dwFindType,
  [in] const void     *pvFindPara,
  [in] PCCERT_CONTEXT pPrevCertContext
);

參數

[in] hCertStore

要搜尋的 證書存儲句柄

[in] dwCertEncodingType

指定所使用的編碼類型。 憑證和 訊息編碼類型 都必須結合位OR 作業,如下列範例所示:

X509_ASN_ENCODING |PKCS_7_ASN_ENCODING目前定義的編碼類型如下:

  • X509_ASN_ENCODING
  • PKCS_7_ASN_ENCODING

[in] dwFindFlags

與某些 dwFindType 搭配使用, 值來修改搜尋準則。 對於大部分 dwFindType 值,dwFindFlags 不會使用,而且應該設定為零。 如需詳細資訊,請參閱。

[in] dwFindType

指定要進行的搜尋類型。 搜尋類型會決定資料類型、內容,以及使用 pvFindPara。 此參數可以是下列其中一個值。

價值 意義
CERT_FIND_ANY
pvFindPara的數據類型:未使用 NULL

未使用搜尋準則。 傳回存放區中的下一個憑證。

附注 存放區中可能不會保留憑證內容的順序。 若要存取特定憑證,您必須在存放區中反覆運算憑證。
 
CERT_FIND_CERT_ID
pvFindPara的數據類型:CERT_ID 結構。

尋找指定之 CERT_ID所識別的憑證。

CERT_FIND_CTL_USAGE
pvFindPara的數據類型:CTL_USAGE 結構。

搜尋具有szOID_ENHANCED_KEY_USAGE延伸模組的憑證,或符合 CTL_USAGE 結構 成員 pszUsageIdentifier 的CERT_CTL_PROP_ID。

CERT_FIND_ENHKEY_USAGE
pvFindPara的數據類型:CERT_ENHKEY_USAGE 結構。

搜尋存放區中具有 增強金鑰使用 擴充功能或增強金鑰使用屬性,以及符合 CERT_ENHKEY_USAGE 結構中 cUsageIdentifier 成員的使用標識符。

如果憑證具有設定為 szOID_ENHANCED_KEY_USAGE pszObjId 成員的 CERT_EXTENSION 結構,則憑證具有增強的密鑰使用延伸模組。

如果已設定憑證CERT_ENHKEY_USAGE_PROP_ID標識符,則憑證具有增強的密鑰使用方式屬性。

如果在 dwFindFlags中設定CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG,則沒有密鑰使用方式延伸模組或屬性的憑證也會相符。 在 pvFindPara中,設定此旗標的優先順序高於傳遞 NULL

如果已設定CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG,則只會在密鑰使用延伸模組上完成比對。

如需搜尋準則之旗標修改的相關信息,請參閱。

CERT_FIND_EXISTING
pvFindPara的數據類型:CERT_CONTEXT 結構。

搜尋與指定之憑證內容完全相符的憑證。

CERT_FIND_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有SHA1哈希的憑證,該哈希符合 CRYPT_HASH_BLOB 結構中的哈希。

CERT_FIND_HAS_PRIVATE_KEY
pvFindPara的數據類型:未使用 NULL

搜尋具有私鑰的憑證。 金鑰可以是暫時或儲存在磁碟上。 密鑰可以是舊版密碼編譯 API (CAPI) 金鑰或 CNG 金鑰。

附注 存放區中可能不會保留憑證內容的順序。 因此,若要存取特定憑證,您必須跨所有憑證進行反覆運算。
 
Windows 8 和 Windows Server 2012:支援此旗標開始。
CERT_FIND_ISSUER_ATTR
pvFindPara的數據類型:CERT_RDN 結構。

搜尋具有符合 CERT_RDN 結構中屬性之指定簽發者屬性的憑證。 如果設定這些值,函式會比較憑證中籤發者的屬性與這個 CERT_RDN 結構中 CERT_RDN_ATTR 陣列的專案。 比較會逐一查看尋找與憑證簽發者屬性相符的 CERT_RDN_ATTR 屬性。

如果 pszObjId 成員 CERT_RDN_ATTRNULL,則會忽略屬性對象標識符。

如果 dwValueTypeCERT_RDN_ATTR 的成員是CERT_RDN_ANY_TYPE,則會忽略實值型別。

如果 pbDataCERT_RDN_VALUE_BLOB 成員 NULL,則任何值都是相符的。

目前只支援區分大小寫的確切比對。 如需 Unicode 選項的相關信息,請參閱。 設定這些值時,搜尋會限制為編碼類型符合 dwCertEncodingType的憑證。

CERT_FIND_ISSUER_NAME
pvFindPara的 數據類型:CERT_NAME_BLOB 結構。

搜尋與 CERT_NAME_BLOB 中名稱完全相符之整個簽發者名稱的憑證。搜尋僅限於符合 dwCertEncodingType的憑證。

CERT_FIND_ISSUER_OF
pvFindPara的數據類型:CERT_CONTEXT 結構。

搜尋具有符合 CERT_CONTEXT中籤發者之主體的憑證。

請使用 CertGetCertificateChain 函式,而不是搭配此值使用 CertFindCertificateInStore

CERT_FIND_ISSUER_STR
pvFindPara的數據類型:Null 終止的 Unicode 字串。

搜尋包含指定簽發者名稱字串的憑證。 憑證的簽發者成員會使用格式化為 CERT_SIMPLE_NAME_STR 的適當格式,將憑證的簽發者成員轉換成適當類型的名稱字串 CertNameTo Str。 接著會執行不區分大小寫的子字串內字串比對。 設定此值時,搜尋會限制為編碼類型符合 dwCertEncodingType的憑證。

如果子字串比對失敗,且主旨包含具有 Punycode 編碼字串的電子郵件 RDN,則會使用 CERT_NAME_STR_ENABLE_PUNYCODE_FLAG 將主旨轉換成 Unicode 字元串,並再次執行子字元串比對。

CERT_FIND_KEY_IDENTIFIER
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有CERT_KEY_IDENTIFIER_PROP_ID屬性的憑證,該屬性符合 CRYPT_HASH_BLOB中的密鑰標識碼。

CERT_FIND_KEY_SPEC
包含索引鍵規格的 pvFindPara資料類型:DWORD 變數。

搜尋具有符合 pvFindPara 中密鑰規格之CERT_KEY_SPEC_PROP_ID屬性的憑證。

CERT_FIND_MD5_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有符合 CRYPT_HASH_BLOB中哈希的 MD5 哈希的憑證。

CERT_FIND_PROPERTY
pvFindPara的數據類型:包含屬性識別碼的 DWORD 變數。

搜尋具有屬性的憑證,其符合 DWORDpvFindPara中指定的屬性識別符。

CERT_FIND_PUBLIC_KEY
pvFindPara的數據類型:CERT_PUBLIC_KEY_INFO 結構。

搜尋具有符合 CERT_PUBLIC_KEY_INFO 結構中公鑰的公鑰的憑證。

CERT_FIND_SHA1_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有SHA1哈希的憑證,該哈希符合 CRYPT_HASH_BLOB 結構中的哈希。

CERT_FIND_SHA1_SHA256_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有符合 CRYPT_HASH_BLOB 結構中哈希的SHA1 + SHA256 哈希的憑證。

CERT_FIND_SHA256_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有符合 CRYPT_HASH_BLOB 結構中哈希的SHA256哈希的憑證。

CERT_FIND_SIGNATURE_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

搜尋具有符合 CRYPT_HASH_BLOB 結構中籤章哈希之簽章哈希的憑證。

CERT_FIND_SUBJECT_ATTR
pvFindPara的數據類型:CERT_RDN 結構。

搜尋具有符合 CERT_RDN 結構中屬性之指定主體屬性的憑證。 如果已設定 RDN 值,函式會比較憑證中主體的屬性與這個 CERT_RDN 結構中 CERT_RDN_ATTR 陣列的專案。 比較會逐一查看尋找與憑證主體屬性相符的 CERT_RDN_ATTR 屬性。

如果 pszObjId 成員 CERT_RDN_ATTRNULL,則會忽略屬性對象標識符。

如果 dwValueTypeCERT_RDN_ATTR 的成員是CERT_RDN_ANY_TYPE,則會忽略實值型別。

如果 pbDataCERT_RDN_VALUE_BLOB 成員 NULL,則任何值都是相符的。

目前只支援區分大小寫的確切比對。

如需 Unicode 選項的相關信息,請參閱。 設定這些值時,搜尋會限制為編碼類型符合 dwCertEncodingType的憑證。

CERT_FIND_SUBJECT_CERT
pvFindPara的數據類型:CERT_INFO 結構。

搜尋具有簽發者和序號的憑證,其符合 CERT_INFO 結構中的簽發者和序號。

CERT_FIND_SUBJECT_NAME
pvFindPara的 數據類型:CERT_NAME_BLOB 結構。

搜尋與整個主體名稱完全相符的憑證,並在 CERT_NAME_BLOB 結構中尋找名稱。 搜尋僅限於符合 dwCertEncodingType值的憑證。

CERT_FIND_SUBJECT_STR
pvFindPara的數據類型:Null 終止的 Unicode 字串。

搜尋包含指定主體名稱字串的憑證。 憑證的主體成員會使用格式化為 CERT_SIMPLE_NAME_STR 的適當格式,將憑證的主體成員轉換成適當類型的名稱字串 CertNameTo Str。 接著會執行不區分大小寫的子字串內字串比對。 設定此值時,搜尋會限制為編碼類型符合 dwCertEncodingType的憑證。

CERT_FIND_CROSS_CERT_DIST_POINTS
pvFindPara的數據類型:不使用。

尋找具有跨憑證發佈點延伸模組或屬性的憑證。

CERT_FIND_PUBKEY_MD5_HASH
pvFindPara數據類型:CRYPT_HASH_BLOB 結構。

尋找 MD5 哈希公鑰符合指定哈希的憑證。

 
Note dwFindType dwFindType 中傳遞字串的替代形式 。 一個窗體會使用 Unicode 字串,另一個是 ASCII 字串。 以 「_W」 結尾或沒有後綴的值會使用 Unicode。 以 「_A」 結尾的值會使用 ASCII 字串。
 

[in] pvFindPara

指向與 dwFindType搭配使用的數據項或結構。

[in] pPrevCertContext

這個函式所傳回之最後一個 CERT_CONTEXT 結構的指標。 在函式的第一次呼叫上,此參數必須 NULL。 若要尋找符合搜尋準則的後續憑證,請將 pPrevCertContext 設定為先前呼叫函式所傳回的指標。 此函式會釋放此參數的非NULL 值所參考的 CERT_CONTEXT

傳回值

如果函式成功,函式會傳回只讀 CERT_CONTEXT 結構的指標。

如果函式失敗,且找不到符合搜尋準則的憑證,則傳回值會 NULL

CertFindCertificateInStore 傳回的非NULLCERT_CONTEXT,必須透過 CertFreeCertificateContext 或傳遞為 pPrevCertContext 參數,在後續呼叫 CertFindCertificateInStore時釋放。

如需擴充錯誤資訊,請呼叫 getLastError。 以下是一些可能的錯誤碼。

傳回碼 描述
CRYPT_E_NOT_FOUND
找不到符合搜尋準則的憑證。 如果商店是空的,或到達商店清單的結尾,就會發生這種情況。
E_INVALIDARG
hCertStore 參數中的句柄與 pPrevCertContext 參數所 指向的憑證 內容中 的句柄不同,或是 dwFindType 參數中指定的值。

言論

dwFindFlags 參數可用來修改某些搜尋類型的準則。

CERT_UNICODE_IS_RDN_ATTRS_FLAG dwFindFlags 值只會與 dwFindType的CERT_FIND_SUBJECT_ATTR和CERT_FIND_ISSUER_ATTR值搭配使用。 如果 pvFind Para 所指向的 CERT_RDN_ATTR 結構是以 Unicode 字串初始化,則必須設定CERT_UNICODE_IS_RDN_ATTRS_FLAG。 進行任何比較之前,會使用 X509_UNICODE_NAME 來提供 Unicode 比較來轉換要比對的字串。

下列 dwFindFlags 值只會與 dwFindTypeCERT_FIND_ENKEY_USAGE 值搭配使用:

可呼叫 CertDuplicateCertificateContext,以複製傳回的內容。 傳回的內容可以使用 CertAddCertificateContextToStore,將傳回的內容新增至不同的 證書存儲,或使用 CertAddCertificateLinkToStore,將該憑證內容的連結新增至不是集合存放區的存放區。

在後續呼叫函式時,會釋出傳回的指標做為 pPrevCertContext 參數 。 否則,必須藉由呼叫 CertFreeCertificateContext明確釋放指標。 CertFindCertificateInStore 呼叫 CertFreeCertificateContext,即使函式發生錯誤,pPrevCertContextNULL

例子

下列範例示範在符合搜尋準則的證書存儲中尋找憑證內容。 如需包含此範例內容的完整範例,請參閱 範例 C 程式:證書儲存作業

如需使用此函式的另一個範例,請參閱 範例 C 程式:集合和同層級證書儲存作業

#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#pragma comment(lib, "crypt32.lib")

#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

void main()
{
//-------------------------------------------------------------------
// Declare and initialize variables.
HCERTSTORE  hSystemStore;              // The system store handle.
PCCERT_CONTEXT  pDesiredCert = NULL;   // Set to NULL for the first 
                                       // call to
                                       // CertFindCertificateInStore.
LPCSTR lpszCertSubject = (LPCSTR) "Cert_subject_1";


//-------------------------------------------------------------------
// Open the certificate store to be searched.

if(hSystemStore = CertOpenStore(
     CERT_STORE_PROV_SYSTEM, 
     0,                      // Encoding type not needed 
                             // with this PROV.
     NULL,                   // Accept the default HCRYPTPROV. 
     CERT_SYSTEM_STORE_CURRENT_USER,
                             // Set the system store location in 
                             // the registry.
     L"MY"))                 // Could have used other predefined 
                             // system stores
                             // including Trust, CA, or Root.
{
   printf("Opened the MY system store. \n");
}
else
{
   printf( "Could not open the MY system store.\n");
   exit(1);
}
//-------------------------------------------------------------------
// Get a certificate that has lpszCertSubject as its 
// subject. 

if(pDesiredCert=CertFindCertificateInStore(
      hSystemStore,
      MY_ENCODING_TYPE,           // Use X509_ASN_ENCODING.
      0,                          // No dwFlags needed. 
      CERT_FIND_SUBJECT_STR,      // Find a certificate with a
                                  // subject that matches the string
                                  // in the next parameter.
      lpszCertSubject ,           // The Unicode string to be found
                                  // in a certificate's subject.
      NULL))                      // NULL for the first call to the
                                  // function. In all subsequent
                                  // calls, it is the last pointer
                                  // returned by the function.
{
  printf("The desired certificate was found. \n");
}
else
{
   printf("Could not find the desired certificate.\n");
}
//-------------------------------------------------------------------
// Clean up. 

if(pDesiredCert)
    CertFreeCertificateContext(pDesiredCert);
if(hSystemStore)
    CertCloseStore(
        hSystemStore, 
        CERT_CLOSE_STORE_CHECK_FLAG);

要求

要求 價值
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
支援的最低伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平臺 窗戶
標頭 wincrypt.h
連結庫 Crypt32.lib
DLL Crypt32.dll

另請參閱

CERT_CONTEXT

CertAddCertificateContextToStore

CertAddCertificateLinkToStore

CertDuplicateCertificateContext

CertEnumCertificatesInStore

CertFreeCertificateContext

CertGetCertificateChain

CertNameToStr

憑證函式