OpenSSL 使用拾遗(一)---- 生成 pkcs12 文件
从本期开始,记录一些在使用 OpenSSL 过程中碰到的问题及解决办法
在 Linux 下需要生成 pkcs12 文件,立即想到 OpenSSL。键入如下命令
~ # openssl pkcs12 -export -inkey clientkey.pem -in client.crt -out client.p12
No certificate matches private key ~ # openssl version
OpenSSL 0.9.8j Jan
奇怪,明明 clientkey.pem 和 client.crt 是刚生成的配套文件,其中前者保存私钥,后者则是用户证书(包含公钥),怎么会出错?
于是切换到 Windows 平台再验证一番,虽然版本不同,但仍然报错,只不过显示的错误信息不一样
d:\>openssl pkcs12 -export -inkey clientkey.pem -in client.crt -out client.p12
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Loading 'screen' into random state - done
unable to load certificates d:\>openssl version
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
OpenSSL 1.0.1f 6 Jan 2014
没办法,只得祭出调试器,到源码内部看个究竟。既然在 Windows 平台,就用顺手的 Visual Studio。打开(以前建立的)OpenSSL 解决方案(OpenSSL 版本号 1.0.1f),切换到 Debug 配置,确保该配置实际包含【-Zi】调试选项。
准备下断点,该在哪里下呢?
由于错误信息为 unable to load certificates ,其中过程肯定涉及到证书加载函数,所以应该是 load_cert(不要问我为什么知道,因为我熟悉^_^)。如果不熟悉,可以在 Source Insight 中用 F7 调出【Browse Project Symbols】对话框,输入猜测的关键字,比如 load/certificate 等,也能找到 load_cert 函数。
反正不论如何,找到了怀疑函数 load_cert。在 Visual Studio 中新建此函数的断点,并在 IDE 中配置好命令参数和工作目录。F5 启动,果然命中,说明成功了一半。继续跟踪,最后得到出错的位置如下(位于文件 crypto\pem\pem_lib.c 中)
buf[]='\0';
for (;;)
{
i=BIO_gets(bp,buf,);
if (i <= )
{
PEMerr(PEM_F_PEM_READ_BIO,PEM_R_NO_START_LINE);
goto err; // <-- 【在此处出错,并跳出】
}
出错的调用栈为
openssl.exe!main
openssl.exe!do_cmd
openssl.exe!pkcs12_main
openssl.exe!load_certs
openssl.exe!load_certs_crls
libeay32.dll!PEM_X509_INFO_read_bio
libeay32.dll!PEM_read_bio
自底向上逐个切换调用栈,查看是哪里引发了问题,结果在 pkcs12_main 函数(文件 apps\pkcs12.c)中,发现如下一处调用
/* Load in all certs in input file */
if(!(options & NOCERTS))
{
certs = load_certs(bio_err, infile, FORMAT_PEM, NULL, e,
"certificates"); // <-- 【以 PEM 格式加载证书】
if (!certs)
goto export_end;
原来证书要求以 PEM 格式加载,回过头用文本编辑器打开 client.crt。果然,此文件是 DER 格式的。
名不副实,自然是要出问题的。
原因知道了,解决办法也立即有了。使用如下命令将证书转为 PEM 格式
d:\>openssl x509 -in client.crt -inform der -out client.pem
然后再执行一次 pkcs12 命令
d:\>openssl pkcs12 -export -inkey clientkey.pem -in client.pem -out client.p12
问题得到解决。
自然想到,难道 pkcs12 命令就不提供 -inform 的格式转换选项?
运行命令【openssl pkcs12 ?】,可以看到确实没有提供 -inform 选项,看来还是有改进的空间。
OpenSSL 使用拾遗(一)---- 生成 pkcs12 文件的更多相关文章
- C++ OpenSSL 之二:生成RSA文件
1.等同于生成private key: openssl genrsa -out "save_path" 2048 2.代码如下 bool MakeRsaKeySSL(const c ...
- C++ OpenSSL 之五:生成P12文件
1.等同于使用: openssl pkcs12 -export -inkey "key_path" -in "pem_path" -out "save ...
- C++ OpenSSL 之三:生成CSR文件
1.等同于使用: openssl req -new -key "key_path" -out "save_path" -subj "/emailAdd ...
- 使用OpenSSL生成CSR文件,并申请全球通用SSL证书
http://www.openssl.org 上只有OpenSSL的原代码下载,为了方便Windows用户使用OpenSSL,我们特地为您准备了OpenSSL 0.9.8.a for win32的可执 ...
- 利用keytool、openssl生成证书文件
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...
- 用OpenSSL命令行生成证书文件
用OpenSSL命令行生成证书文件 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加 ...
- openssl asn.1 生成DER文件,把DER文件转换成内部数据结构
1 在实现之前,先来介绍如何生成der文件,有了源数据才能进行验证和测试.生成的方法是使用在openssl的命令中使用*asn1parse*根据配置文件来生成.详情如下: 1.1 创建配置文件test ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...
- 用openssl为WEB服务器生成证书(自签名CA证书,服务器证书)
用openssl为WEB服务器生成证书(自签名CA证书,服务器证书) 来源: https://www.cnblogs.com/osnosn/p/10608455.html 来自osnosn的博客 写于 ...
随机推荐
- excle表格生成网页
用Dreamweaver可以方便生成和excle表格一样的代码. 复制excle,粘贴
- 解读浮动闭合最佳方案:clearfix
.clear{clear:both;height:0;overflow:hidden;} 上诉办法是在需要清除浮动的地方加个div.clear或者br.clear,我们知道这样能解决基本清浮动问题. ...
- Python 小练习
输出标题以及长度 结果 输出网页下方学校地理位置以及 输出"abcdefg"base64编码 输出网页内容的MD5 hash
- call 和 apply使用
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.因为 JavaScript 的函数存在「定义时上下文」 ...
- 检测cpu是否支持虚拟化和二级地址转换【转】
SLAT:二级地址转换 用微软的小工具“Coreinfo.exe” 下载地址是: http://technet.microsoft.com/en-us/sysinternals/cc835722 ...
- C# WebForm内置对象2+Repeater的Command
内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及 ...
- IIS部署WCF网站服务步骤
一开始在“管理工具”下找不到IIS的快捷方式,是因为系统默认未打开IIS功能,所以首先打开IIS功能: 为避免出现未知的麻烦,建议将IIS下的所有项都勾上: 创建IIS桌面快捷方式: 添加网站托管: ...
- RMAN 前期准备工作和实例
理解恢复目录,RMAN可以在没有恢复目录(NOCATALOG)下运行,这个时候备份信息保存在控制文件.保存在控制文件的备份信息是很危险的,如果控制文件的破坏将导致备份信息的丢失与恢复的失败,而且,没有 ...
- blade and soul Group Combos
Group Combos A martial artist always make friends along their way. They learn how to work and fight ...
- scala 打印一个乘法口诀表 (<<scala 编程>> P87)
(for(i <- 1 to 9;j <- 1 to i; s = s"$j*$i=${i*j}\t") yield {if(j==1) s"$s\n&quo ...