微軟的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用例來...