日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java解码p7b证书文件,通过OpenSSL解码X509证书文件

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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证书文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。