1. 程式人生 > >驗證證書的有效性(cryptoapi)

驗證證書的有效性(cryptoapi)

使用CertGetIssuerCertificateFromStore函式來驗證證書的有效性,其函式宣告如下:

PCCERT_CONTEXT WINAPI CertGetIssuerCertificateFromStore(
  HCERTSTORE ,      //[in]要查詢的證書庫
  PCCERT_CONTEXT ,  //[in]包含主題的證書內容
  PCCERT_CONTEXT , //[in]包含頒發者證書的內容,第一次查詢時為NULL
  DWORD* );
pPrevIssuerContext這個引數在第一次尋找頒發者證書時必須為NULL,以後尋找下一個頒發者證書時
將上次返回的PCCERT_CONTEXT傳給它(因為同一個頒發者可能有很多個證書),注意這裡傳過來的
PCCERT_CONTEXT的結構在函式執行完後將被釋放.
pdwFlags [in,out]
[in]
為要驗證證書內容的標誌,主要有以下幾個(可以用或連線):
CERT_STORE_REVOCATION_FLAG 驗證證書是否在CRL列表中
CERT_STORE_SIGNATURE_FLAG 用頒發者證書的公鑰來驗證主題證書是否有效
CERT_STORE_TIME_VALIDITY_FLAG 驗證主題證書是否在有效期內
[out]
做為返回值返回時,這個標誌又多了兩個值,如下:
CERT_STORE_NO_CRL_FLAG 沒有匹配的CRL,也就是說在CRL列表中沒有找到此證書
CERT_STORE_NO_ISSUER_FLAG 在證書庫中沒有找到頒發者證書







函式執行完後,
pdwFlags
將被重新設定,驗證成功的標誌將被設為0,失敗的仍然不變,注意:
當CERT_STORE_REVOCATION_FLAG 被設定,並且在證書庫的CRL中也沒有找到時,返回的
pdwFlags 中CERT_STORE_NO_CRL_FLAG將被設定而且CERT_STORE_REVOCATION_FLAG繼續
保留.當 CERT_STORE_SIGNATURE_FLAG or CERT_STORE_REVOCATION_FLAG 被設定時,若
函式找不到頒發者的證書,在返回時CERT_STORE_NO_ISSUER_FLAG的標誌將被設定.
注意:如果證書被驗證為無效的,函式仍然返回找到的頒發者證書的CERT_CONTEXT的指標.
如果函式調用出錯,返回NULL,這時可以呼叫GetLastError()查看出錯的資訊:
CRYPT_E_NOT_FOUND 頒發者證書沒找到
CRYPT_E_SELF_SIGNED 主題證書與頒發者證書是一樣的(自簽名證書)
E_INVALIDARG pdwFlags 引數值無效或是hCertStore指定的控制代碼與pPrevIssuerContext的不
一致.