从本期开始,记录一些在使用 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 文件的更多相关文章

  1. C++ OpenSSL 之二:生成RSA文件

    1.等同于生成private key: openssl genrsa -out "save_path" 2048 2.代码如下 bool MakeRsaKeySSL(const c ...

  2. C++ OpenSSL 之五:生成P12文件

    1.等同于使用: openssl pkcs12 -export -inkey "key_path" -in "pem_path" -out "save ...

  3. C++ OpenSSL 之三:生成CSR文件

    1.等同于使用: openssl req -new -key "key_path" -out "save_path" -subj "/emailAdd ...

  4. 使用OpenSSL生成CSR文件,并申请全球通用SSL证书

    http://www.openssl.org 上只有OpenSSL的原代码下载,为了方便Windows用户使用OpenSSL,我们特地为您准备了OpenSSL 0.9.8.a for win32的可执 ...

  5. 利用keytool、openssl生成证书文件

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...

  6. 用OpenSSL命令行生成证书文件

    用OpenSSL命令行生成证书文件 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加 ...

  7. openssl asn.1 生成DER文件,把DER文件转换成内部数据结构

    1 在实现之前,先来介绍如何生成der文件,有了源数据才能进行验证和测试.生成的方法是使用在openssl的命令中使用*asn1parse*根据配置文件来生成.详情如下: 1.1 创建配置文件test ...

  8. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  9. 用openssl为WEB服务器生成证书(自签名CA证书,服务器证书)

    用openssl为WEB服务器生成证书(自签名CA证书,服务器证书) 来源: https://www.cnblogs.com/osnosn/p/10608455.html 来自osnosn的博客 写于 ...

随机推荐

  1. 从github拉取项目到myeclipse本地

    1.首先拿到jacky-lulu分享的地址 https://github.com/jacky-lulu1/cxf_client 2.登录jacky-lulu账号,fork一份cxf_client到自己 ...

  2. spring 驱动模式

    驱动模式 public class ProAction extends ActionSupport implements ModelDriven<Product>{ //驱动模式 priv ...

  3. angularJS 2.0 开发的简单dome

    与其说这是一个demo,不如说是一个与高手的讨教过程.虽然demo出来了,可其中有些问题我还是不太明白,如果有angularjs2.0的大神,请进来指导一番,~~~~~不甚感激. 说明第一点:我采用的 ...

  4. c# 打乱数组

    有时候得到了一个List,我想把它随机排列一下顺序.而且如果针对不同类型的List都能用,就要用到泛型. 其实思想很简单,就是从原List中每次随机取一项,添加到新的List中,并在原List中删除. ...

  5. postgres 正则表达式 转

    http://blog.csdn.net/wugewuge/article/details/7704996 postgresql中使用正则表达式时需要使用关键字“~”,以表示该关键字之前的内容需匹配之 ...

  6. poj 3734 Blocks

    ゲート 分析:这题过的人好多,然后大家好像是用矩阵过的(((φ(◎ロ◎;)φ))).我自己是推公式的. 对于任意的有这个式子, 就是先从里面选偶数个涂成两个指定的颜色,再在选出的里面选定涂某种颜色,选 ...

  7. 使用dreamweaver去掉文本中的空格和换行

    当我们从其他地方拷贝文本到网页,在html代码中会自动带有空格和换行,手动去掉很麻烦,今天试着用dreamweaver去了一下,方法如下: 1.点击Ctrl+F,打开“查找和替换”窗口 2‘见下图:

  8. Python笔记总结week8

    面向对象第二节 要点: 1. 封装,对象中嵌套对象 2. pickle,load,切记,一定要先导入相关的类 回顾上一节: 面向对象三大特性: 封装.继承.多态(多种类型.多种形态) 关于多态,任意参 ...

  9. CentOS_7.2安装MySQL_5.7

    一.安装依赖包和开发工具: yum install vim vim-enhanced wget zip unzip telnet ntsysv compat* apr* nasm* gcc gcc* ...

  10. MVC5+EF6 入门完整教程八

    本篇是相对独立的一篇,主要讲解不丢失数据进行数据库结构升级. 前面我们讲解EF功能时,已经介绍过一种更新数据库的方式: EF比较model和database,如果两边不一致,程序将会drop and ...