java解码p7b证书文件,通过OpenSSL解码X509证书文件
在Windows平臺下,如果要解析一個X509證書文件,最直接的辦法是使用微軟的CryptoAPI。但是在非Windows平臺下,就只能使用強大的開源跨平臺庫OpenSSL了。一個X509證書通過OpenSSL解碼之后,得到一個X509類型的結構體指針。通過該結構體,我們就可以獲取想要的證書項和屬性等。
X509證書文件,根據封裝的不同,主要有以下三種類型:
*.cer:單個X509證書文件,不私鑰,可以是二進制和Base64格式。該類型的證書最常見;
*.p7b:PKCS#7格式的證書鏈文件,包含一個或多個X509證書,不含私鑰。通常從CA中心申請RSA證書時,返回的簽名證書就是p7b格式的證書文件;
*.pfx:PKCS#12格式的證書文件,可以包含一個或者多個X509證書,含有私鑰,一般有密碼保護。通常從CA中心申請RSA證書時,加密證書和RSA加密私鑰就是一個pfx格式的文件返回。
下面,針對這三種類型的證書文件,使用OpenSSL進行解碼,得到對應的X509結構體指針。需要注意的是,示例代碼中的證書文件內容都是指二進制數據,如果證書文件本身使用的Base64格式,從文件讀取之后,需要將Base64格式的內容轉化為二進制數據,才能使用下面的解碼函數。
一、解碼CER證書文件
CER格式的文件最簡單,只需要調用API?d2i_X509()即可。示例代碼如下(lpCertData為二進制數據):
m_pX509 = d2i_X509(NULL, (unsigned char const **)&lpCertData, ulDataLen);
if (m_pX509 == NULL)
{
return CERT_ERR_FAILED;
}
二、解碼P7B證書文件
由于P7B是個證書鏈文件,理論上可以包含多個X509證書。但是實際應用中,往往只包含一個文件,所以我們只處理第一個證書。示例代碼如下:
int rv = 0;
int nid = 0;
PKCS7* p7 = NULL;
STACK_OF(X509) *certs = NULL;
BIO* bio = BIO_new(BIO_s_mem());
// 解碼p7b內容
rv = BIO_write(bio, lpCertData, ulDataLen);
p7 = d2i_PKCS7_bio(bio, NULL);
BIO_free(bio);
// 獲取P7的具體格式
nid = OBJ_obj2nid(p7->type);
if(nid == NID_pkcs7_signed)
{
certs = p7->d.sign->cert;
}
else if(nid == NID_pkcs7_signedAndEnveloped)
{
certs = p7->d.signed_and_enveloped->cert;
}
// 只支持單證書的p7b
m_pX509 = sk_X509_value(certs, 0);
if (m_pX509 == NULL)
{
return CERT_ERR_FAILED;
}如在特殊的情況下,需要處理整個證書鏈中的所有證書,則只需要循環調用sk_X509_value()知道返回為NULL為止。
三、解碼PFX證書文件
解碼PFX證書時,實際上是獲取X509證書、私鑰數據和CA證書鏈一系列對象,同時需要校驗PFX的密碼。示例代碼如下:
int rv = 0;
PKCS12 *p12 = NULL;
EVP_PKEY *pkey = NULL;
STACK_OF(X509) *ca = NULL;
BIO *bio;
// 解碼P12內容
bio = BIO_new(BIO_s_mem());
rv = BIO_write(bio, lpCertData, ulDataLen);
p12 = d2i_PKCS12_bio(bio, NULL);
BIO_free_all(bio);
// 獲取證書對象
rv = PKCS12_parse(p12, lpscPassword, &pkey, &m_pX509, &ca);
if (!rv || !m_pX509)
{
rv = CERT_ERR_FAILED;
goto FREE_MEMORY;
}
// 釋放內存
FREE_MEMORY:
PKCS12_free(p12);
EVP_PKEY_free(pkey);
sk_X509_free(ca);
至此,三種常見證書文件的解碼以完成,通過解碼得到的證書上下文結構體指針m_pX509,通過該指針就可以解析證書的項和擴展屬性了。具體的解析方法,將在后續的Blog中逐一介紹。
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
原文:http://blog.csdn.net/yyfzy/article/details/46682207
總結
以上是生活随笔為你收集整理的java解码p7b证书文件,通过OpenSSL解码X509证书文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php vprintf,vprintf
- 下一篇: oracle 10g客户端连接11g,生