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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 网页手册模板,网站表单模板

前端界面默认网站表单模板介绍发布:/template/pc/default/home/form_post.html列表:/template/pc/default/home/form_list.html查看:/template/pc/default/home/form_show.html自定义网站表单模板介绍发布:/template/pc/default/h…

iOS安全攻防(三):使用Reveal分析他人app

使用Reveal分析他人app准备工作1)已越狱的设备,而且已安装了OpenSSH,MobileSubstrate等有用工具(Cydia源里安装)2)本地已安装了Reveal操作步骤1)拷贝framework和dylib到越狱机scp -r /Applications/Reveal.app/Contents/SharedSup…

orm框架选型问题_ORM问题

orm框架选型问题在过去的几年中,像Hibernate这样的对象关系映射工具已经帮助开发人员在处理关系数据库方面获得了巨大的生产力增长。 ORM使开发人员可以专注于应用程序逻辑,并避免为诸如插入或查询之类的简单任务编写大量样板SQL。 但是,充分…

iwifi 命令

1: tftp -gr ctwancfg.html 192.168.1.18转载于:https://www.cnblogs.com/gavinwu/p/4221790.html

JBoss BPM Travel Agency演示与现代BPM数据集成

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使用…

京东php asp,jd jd demo 关于php的代码里面是 一些京东的接口 包含了 重要 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...

开发工具: PHP文件大小: 183 KB上传时间: 2013-04-15下载次数: 1详细说明:jd demo 关于php的代码里面是关于一些京东的接口里面的代码包含了一些重要-jd demo about php code jingdong interface文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评…

scala入门-10 隐式转换、隐式参数、隐式类

到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下隐式类: 相当于&…

抢答网页PHP,[抢答]抢答环节已结束,相关答案已封箱 - 薅羊毛(Coupon)版 - 北大未名BBS...

mojave (你说得都对) 在 ta 的帖子中提到:抢答活动已经全部结束。截止目前,以下题目的正确答案不足5个:第9题、第22题、第23题等。封盘时间为今晚23:00。各位可以在封盘之前继续回答。另外我们提醒大家,如果一题中有多个回答&…

连载《一个程序猿的生命周期》-2.城市校园生活

一个程序猿的生命周期 微信平台 口 号:职业交流,职业规划;面对现实,用心去交流、感悟。 公众号:iterlifetime 百木-ITer职业交流奋斗 群:141588103 微 博:http://www.weibo.com/u/57234…

jvm锁_JVM如何处理锁

jvm锁当我们谈论最新版本的Sun Hotspot Java虚拟机1.6时,当您尝试从java.util.concurrent.locks.Lock实现获取锁或输入同步块时,JVM将执行以下三种锁类型: 有偏见的 :有时,即使在并发系统中也没有争用,并且…

excel使用MySQL数据,如何使用mysql完成excel中的数据生成

Excel是数据分析中最常用的工具,本篇文章通过mysql与excel的功能对比介绍如何使用mysql完成excel中的数据生成,数据清洗,预处理,以及最常见的数据分类,数据筛选,分类汇总,以及数据透视等操作。本…

究竟什么是语法糖呢

其实语法糖只是一个概念,大家可能很早就在接触语法糖了,只是一直不知道这个就是语法糖 百科原话:语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程…

Spring Batch –使用JavaConfig替换XML作业配置

我最近协助一个客户启动并运行了Spring Batch实现。 该团队决定继续为批处理作业使用基于JavaConfig的配置,而不是传统的基于XML的配置。 随着这越来越成为配置Java应用程序的一种常用方法,我觉得是时候更新Keyhole的Spring Batch系列了 ,向您…

php使用accdb,php如何连接access2007的accdb格式数据库文件?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼header("Content-type: text/html; charsetGBK");/*数据库路径,请自己修改,否则可能运行不正常*/$conn new COM("ADODB.Connection") or die("ADO连接失败!");$connstr "PROVIDER…

Karrigell 入门教程

http://wenku.baidu.com/link?urlPG3sP0mnKt-RPLxEPktTtqTsMlCflOwSTdOEgti21pnFaed1K_MSd4Xx-Z-ZvkgyTvIwWFTB1dEy1eQ9gKyIwIVMeKEiforBbVykW0Y2SM_ 讲karrigell 3.1.1,目录结构和2.x版本不一样了。新版本里面是没有Karrigell.ini 文中提到admin目录下有一个模块…

php autoload用法,php自动加载__autoload()函数用法

autoload在php主版本中是自动加载文件的一个方法了我们可以定义许多的文件在目录然后通过autoload加载了,下面来看看autoload函数用法。在PHP5之后,我们可以通过 __autoload来解决这个问题。 而且在PHP5.1之后,还提供了 spl_autoload_registe…

jaxb xsd生成xml_使用JAXB从XSD生成XML

jaxb xsd生成xml这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子。 Mohamed解释了如何使用JAXB从给定的XSD生成XML 。 (注意:对原始帖子进行了少量编辑以提高可读性) 我们可以使用JAXB使用给定的Schema将Java对象…

oracle 10g客户端连接11g,生产环境oracle10g升级至11g准备工作

主要有以下的步骤 :1.new ORACLE_HOME(11g), old ORACLE_HOME (10g)--这些需要提前提供给客户,作为基本的约定2.install oracle software 11.2.0.2.0 on production--总共有7个DB,时间很紧,所以准备要充分3.apply DB patch additional if nee…

JBoss BPM Travel Agency的微服务迁移故事

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使…

windows快捷操作

命令行启动或关闭VMWare服务: net start VMwareHostdVMAuthdServiceVMUSBArbService"VMware NAT Service"VMnetDHCP#启动VMware虚拟机服务net start VMwareHostdnet start "VMware NAT Service"net start VMnetDHCPcmd#停止VMvare虚拟机服务net…