通过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) 
{
<span style="white-space:pre">	</span>certs = p7->d.sign->cert;
} 
else if(nid == NID_pkcs7_signedAndEnveloped) 
{
<span style="white-space:pre">	</span>certs = p7->d.signed_and_enveloped->cert;
}
// 只支持单证书的p7b
m_pX509 = sk_X509_value(certs, 0);
if (m_pX509 == NULL) 
{
<span style="white-space:pre">	</span>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中逐一介绍。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 08:40:42

通过OpenSSL解码X509证书文件的相关文章

【openssl】利用openssl完成X509证书和PFX证书之间的互转

利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL for Windows —— http://gnuwin32.sourceforge.net/packages/openssl.htm 2.安装:此处已OpenSSL for Windows为例 * 点击openssl-0.9.8h-1-setup.exe 进行安装: * 添加环境变量:path

CSP:使用CryptoAPI获取X509证书的HASH(指纹)值

请关注之前的系列文章 使用CryptoAPI解码X509证书内容 使用CryptoAPI解析X509证书基本项 通过之前的文章,我们可以使用CryptoAPI解码X509证书文件,并且解析证书的基本项,这次我们尝试通过CryptoAPI获取证书的HASH值.证书的HASH值,也称指纹值,是检查证书的完整性.正确性的属性.如果使用父证书来验证证书的签名时,就会使用到HASH值. 通过Windows查看证书的方式看到的证书HASH(指纹)值如下: 有了前面系列文章的基础,我们假设已经通过Crypto

CSP:使用CryptoAPI解析X509证书基本项

在之前的文章"CSP:使用CryptoAPI解码X509证书内容"里,讲述了如何使用CryptoAPI将证书文件解码,得到证书上下文句柄PCCERT_CONTEXT的方法.下面我们接着讲述如何通过证书上下文句柄,获得想要的证书项.本文先讲述如何获取证书的基本项,后面还有文章介绍如何获取证书的扩展项. 下面的代码,都是假定已经通过解码证书文件.得到了证书上下文句柄m_pCertContext.至于如何解码证书文件.得到证书上下文句柄m_pCertContext,请阅读之前的文章. 首先,

openssl pem转cer文件 并用base64编码解码过程

#!/bin/bash#pem转ceropenssl x509 -outform der -in 3324861__ksjgs.com.pem -out ksjgs-bak.cer#aes 128加密并用base64编码openssl enc -aes-128-cbc -in ksjgs-bak.cer -out ksjgs-bak-enc.log -a #解密#base64解码base64 -d ksjgs-bak-enc.log > ksjgs-bak-unbase64.log#aes 12

用OpenSSL命令行生成证书文件

1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施! 去除key文件口令的命令: openssl rsa -in server.key -out server.key

用OpenSSL命令行生成证书文件(客户端)

证书文件生成 也许很多人和本人一样深有体会,使用OpenSSL库写一个加密通讯过程,代码很容易就写出来了,可是整个工作却花了了好几天.除将程序编译成功外(没有可以使用的证书文件,编译成功了,它并不能跑起来,并不表示它能正常使用,所以--),还需生成必要的证书和私钥文件使双方能够成功验证对方. 找了n多的资料,很多是说的很模糊,看了n多的英文资料,还是没有办法(不知道是不是外国朋友都比较厉害,不用说明得太清?),无意间找到yawl([email protected])写的文章,难得的汉字(呵呵).

openssl生成https证书 (转)

1.首先要生成服务器端的私钥(key文件):openssl genrsa -des3 -out server.key 1024运行时会提示输入密码,此密码用于加密key文件去除key文件口令的命令:openssl rsa -in server.key -out server.key 2.openssl req -new -key server.key -out server.csr -config openssl.cfg生成Certificate Signing Request(CSR),生成的

openssl生成ssl证书

x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥. crt是CA认证后的证书文,(windows下面的,其实是crt),签署人用自己的key给你签署的凭证. 1.key的生成 openssl genrsa -des3 -out server.key 2048 这样是生成rsa私钥,des3算法,openssl格式,2048位强度

openssl req(生成证书请求和自建CA)

伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉openssl req和证书请求相关知识,可直接跳至后文查看openssl req选项整理,若不熟悉,建议从前向后一步一步阅读. 首先说明下生成证书请求需要什么:申请者需要将自己的信息及其公钥放入证书请求中.但在实际操作过程中,所需要提供的是私钥而非公钥,因为它会自动从私钥中提取公钥.另外,还需要将提供的数据进