CSP 使用CryptoAPI解碼X509證書內容

2021-07-03 13:12:25 字數 2570 閱讀 7933

微軟的cryptoapi提供了一套解碼x509證書的函式,乙個x509證書解碼之後,得到乙個pccert_context型別的結構體指標。通過該結構體,我們就可以獲取想要的證書項和屬性等。

x509證書檔案,根據封裝的不同,主要有以下三種型別:

*.cer:單個x509證書檔案,不私鑰,可以是二進位制和base64格式。該型別的證書最常見;

*.p7b:pkcs#7格式的證書鏈檔案,包含乙個或多個x509證書,不含私鑰。通常從ca中心申請rsa證書時,返回的簽名證書就是p7b格式的證書檔案;

*.pfx:pkcs#12格式的證書檔案,可以包含乙個或者多個x509證書,含有私鑰,一般有密碼保護。通常從ca中心申請rsa證書時,加密證書和rsa加密私鑰就是乙個pfx格式的檔案返回。

下面,針對這三種型別的證書檔案,使用cryptoapi進行解碼,得到對應的pccert_context結構體指標。需要注意的是,示例**中的證書檔案內容都是指二進位制資料,如果證書檔案本身使用的base64格式,從檔案讀取之後,需要將base64格式的內容轉化為二進位制資料,才能使用下面的解碼函式。

一、解碼cer證書檔案

cer格式的檔案最簡單,只需要呼叫api certcreatecertificatecontext()即可。示例**如下(lpcertdata為二進位制資料):

ulong ccspcertificate::_decodex509cert(lpbyte lpcertdata, ulong uldatalen)

m_pcertcontext = certcreatecertificatecontext(global_encoding_type, lpcertdata, uldatalen);

if (!m_pcertcontext)

return cert_err_ok;

}

二、解碼p7b證書檔案

由於p7b是個證書鏈檔案,理論上可以包含多個x509證書。但是實際應用中,往往只包含乙個檔案,所以我們只處理第乙個證書。示例**如下:

ulong ccspcertificate::_decodep7bcert(lpbyte lpcertdata, ulong uldatalen)

; bool bfoundcontainer = false;

if (!lpcertdata || uldatalen == 0)

// 由證書鏈建立乙個證書庫

hcertstore hcertstore = null;

crypt_data_blob datablob = ;

hcertstore = certopenstore(cert_store_prov_pkcs7, global_encoding_type, null, 0, &datablob);

if (null == hcertstore)

// 釋放之前的證書內容

if (m_pcertcontext)

// 得到第乙個證書內容

m_pcertcontext = certenumcertificatesinstore(hcertstore, m_pcertcontext);

if (null == m_pcertcontext)

// 關閉證書庫

close_store:

if (hcertstore)

return ulres;

}

如在特殊的情況下,需要處理整個證書鏈中的所有證書,則只需要迴圈呼叫certenumcertificatesinstore()知道返回為null為止。

三、解碼pfx證書檔案

解碼pfx證書時,和處理p7b很相似,只是多了密碼檢驗。示例**如下:

ulong ccspcertificate::_decodepfxcert(lpbyte lpcertdata, ulong uldatalen, lpstr lpscpassword)

// 建立證書庫

crypt_data_blob datablob = ;

hcertstore = pfximportcertstore(&datablob, lpscpassword ? a2w(lpscpassword) : null, crypt_exportable);

if (null == hcertstore)

if (null == hcertstore)

// 列舉證書,只處理第乙個證書

while(pcertcontext = certenumcertificatesinstore(hcertstore, pcertcontext)) }

// 關閉證書庫

certclosestore(hcertstore, 0);

hcertstore = null;

return ulres;

}

至此,三種常見證書檔案的解碼以完成,通過解碼得到的證書上下文結構體指標m_pcertcontext 就可以解析證書的項和擴充套件屬性了。具體的解析方法,將在後續的blog中逐一介紹。

相關博文:csp:使用cryptoapi解析x509證書基本項

入門 編譯,使用PJSIP,PJMEDIA 譯

在本頁面中將會向你描述如何在microsoft visual studio編譯pjsip類庫 1.在windows上編譯前的準備工作 2.必備的一些條件 3.編譯專案 4.除錯案例程式 6.其他 1.很重要的一項是建立config site.h檔案,詳細情況可以參見編譯前的準備 2.如何你還沒與原 ...

入門 編譯,使用PJSIP,PJMEDIA 譯

入門 編譯,使用pjsip,pjmedia 譯 2011年04月14日 在本頁面中將會向你描述如何在microsoft visual studio編譯pjsip類庫 1.在windows上編譯前的準備工作 2.必備的一些條件 3.編譯專案 4.除錯案例程式 6.其他 2.如何你還沒與原 獲取 在vi...

譯 合理使用標準MODEL MANAGER

乙個manager本質上來說,就是乙個提供給django model的資料庫訪問介面。對於django應用程式中的每個model都至少存在乙個manager。每個model有乙個預設的manager objects 這也是每個model訪問資料庫的預設介面。在本文中,我們使用employees用例來...