[TL]有成功使用curl+个人证书访问https的经验么?

1,620 views
Skip to first unread message

Chinainvent

unread,
Jul 26, 2010, 7:31:23 AM7/26/10
to pon...@googlegroups.com
在linux下,curl命令是一个非常方便的工具。

https的网站,有两种,一种是不需要个人证书就可以访问的,例如:https://www.google.com/;另一种,则需要个人证书,这通常应用在公司的OA系统中,例如:https://www.cn.alibaba-inc.com/

今天,遇到一个问题,我试图使用curl来访问公司的OA系统,阅读了curl的man后,访问需要个人证书的https的网址的方法,应如下所示:

$ curl -E cert.pem -k https://www.cn.alibaba-inc.com/

cert.pem为个人证书的pem格式,通常我们从windows的IE中导出的为pfx格式,需要把pfx转换为pem格式,在网上搜到的方法为:

$ openssl openssl pkcs12 -in cert.pfx -out cert.pem -nodes

可是,按以上方法,在执行:curl -E cert.pem -k https://www.cn.alibaba-inc.com/,报如下错误:

$ curl -E ./yunkai.zhang.pem -k https://www.cn.alibaba-inc.com/
curl: (58) Unable to load client cert -8192.

试问同学们,是否有成功使用curl访问这类https网站的经验,给我分享一下:)


--
Chinainvent
Blog: http://blog.csdn.net/chinainvent
Work at Alibaba

HaoPeiQiang

unread,
Jul 26, 2010, 7:39:37 AM7/26/10
to pon...@googlegroups.com
英语不好就是这样的,你直接


报的错误信息不是说你需要个人证书,而是说www.cn.alibaba-inc.com没有证书,所以不安全,你要是想不需要证书就访问你直接


就可以了

2010/7/26 Chinainvent <chinain...@gmail.com>



--
Tinyfool的开发日记 http://www.tinydust.net/dev/
代码中国网 http://www.codechina.org
myTwitter: http://twitter.com/tinyfool

Chinainvent

unread,
Jul 26, 2010, 7:44:14 AM7/26/10
to pon...@googlegroups.com
我看你是,根本就不知道个人证书与CA证书的区别...

你试过 curl -k https://www.cn.alibaba-inc.com/ 可行么?请先试试,再发言。


2010/7/26 HaoPeiQiang <HaoPe...@gmail.com>

Chinainvent

unread,
Jul 26, 2010, 7:47:14 AM7/26/10
to pon...@googlegroups.com
当你使用curl -k时,与你在浏览器中直接忽略CA证书的检查是一回事,但你并未真正登录网站,只是得到一些错误的提示而已。

2010/7/26 Chinainvent <chinain...@gmail.com>

HaoPeiQiang

unread,
Jul 26, 2010, 7:49:41 AM7/26/10
to pon...@googlegroups.com
哦,我刚才没看到那个页面内容,看错了

你试试cer格式的证书呢?

2010/7/26 Chinainvent <chinain...@gmail.com>

Chinainvent

unread,
Jul 26, 2010, 7:52:00 AM7/26/10
to pon...@googlegroups.com
curl的man里,要求是pem的格式呀:

 -E/--cert <certificate[:password]>
              (SSL) Tells curl to use the specified certificate file when getting a file with HTTPS or FTPS. The certificate must be  in  PEM  format. ...


2010/7/26 HaoPeiQiang <HaoPe...@gmail.com>

Feng Shao

unread,
Jul 26, 2010, 7:55:39 AM7/26/10
to pon...@googlegroups.com
client证书文件名后面是不是要跟密码的?

HaoPeiQiang

unread,
Jul 26, 2010, 7:57:00 AM7/26/10
to pon...@googlegroups.com
貌似是这样的

2010/7/26 Feng Shao <seve...@gmail.com>
client证书文件名后面是不是要跟密码的?

Chinainvent

unread,
Jul 26, 2010, 7:57:19 AM7/26/10
to pon...@googlegroups.com
那个不重要,请看curl的man,如果没有填写密码,会在命令行中提示,当然那种密码的格式我也试过的,不行。


2010/7/26 Feng Shao <seve...@gmail.com>
client证书文件名后面是不是要跟密码的?




Feng Shao

unread,
Jul 26, 2010, 8:50:12 AM7/26/10
to pon...@googlegroups.com


2010/7/26 Chinainvent <chinain...@gmail.com>

那个不重要,请看curl的man,如果没有填写密码,会在命令行中提示,当然那种密码的格式我也试过的,不行。

Chinainvent

unread,
Jul 26, 2010, 9:34:27 AM7/26/10
to pon...@googlegroups.com
谢谢,这个帖子,给我了很大希望,按帖子里的方法,我把ca、key、client cert分了开来了,不过仍然报错,这次我加入了-v选项,使用出错更详细些:

[yunkai@alibaba ~/itbu/https]$ curl -v --key key.pem --cacert ca.pem --cert client.pem:xxxx https://www.cn.alibaba-inc.com
* About to connect() to www.cn.alibaba-inc.com port 443 (#0)
*   Trying 121.0.17.70... connected
* Connected to www.cn.alibaba-inc.com (121.0.17.70) port 443 (#0)
* Initializing NSS with certpath: /etc/pki/nssdb
*   CAfile: ca.pem
  CApath: none
* Closing connection #0
* Out of memory
curl: (27) Out of memory


2010/7/26 Feng Shao <seve...@gmail.com>

lxcypp

unread,
Jul 26, 2010, 9:48:49 AM7/26/10
to pon...@googlegroups.com

看样子一定是客户端证书pem格式的问题了,看看有没有可能是文件换行符的问题,不嫌麻烦的话调试一下curl的源代码吧

在 2010-7-26 下午9:34,"Chinainvent" <chinain...@gmail.com>编写:



谢谢,这个帖子,给我了很大希望,按帖子里的方法,我把ca、key、client cert分了开来了,不过仍然报错,这次我加入了-v选项,使用出错更详细些:


[yunkai@alibaba ~/itbu/https]$ curl -v --key key.pem --cacert ca.pem --cert client.pem:xxxx https://www.cn.alibaba-inc.com
* About to connect() to www.cn.alibaba-inc.com port 443 (#0)
*   Trying 121.0.17.70... connected
* Connected to www.cn.alibaba-inc.com (121.0.17.70) port 443 (#0)
* Initializing NSS with certpath: /etc/pki/nssdb
*   CAfile: ca.pem
  CApath: none
* Closing connection #0
* Out of memory
curl: (27) Out of memory




2010/7/26 Feng Shao <seve...@gmail.com>
>
>
>
> 2010/7/26 Chinainvent <chinain...@gmail.co...

Chinainvent

unread,
Jul 26, 2010, 9:57:35 AM7/26/10
to pon...@googlegroups.com
很难说,调源码是最下策了,手头上还忙着别的活,再看看有没有熟悉的朋友登场吧....

2010/7/26 lxcypp <lxc...@gmail.com>

Fei Yan

unread,
Jul 26, 2010, 9:38:46 PM7/26/10
to pon...@googlegroups.com
看看x509的输出如何?
openssl x509 -text -in <crtname>
貌似你的证书不对

此外可用verify校验下,如
openssl verify cacrt.pem crt.pem

Chinainvent

unread,
Jul 26, 2010, 11:12:51 PM7/26/10
to pon...@googlegroups.com
1. ca证书,是直接从firefox里导出来的,

2. 个人证书,是从IE导出来的pfx格式。

3. 按照我在博客中写的方法,已经把这两个证书成功的应用在了linux下的google chrome上,可以肯定这两个证书(以及从它们转换成pem格式后的证书)都是可以正常工作的。

4. 按照Fei Yan的方法,openssl x509 -text -in <crtname> (如果我没有理解错,这里的crtname是指pem格式的个要证书)输出很正常,不存在格式异常的信息。

5. 使用openssl verify cacrt.pem crt.pem时输出如下(如果我没有理解错,这里的cacrt.pem应是pem格式的ca证书,crt.pem应是pem格式的个人证书):
[yunkai@alibaba ~/itbu/https]$ openssl verify ca.pem yunkai.zhang.pem 
ca.pem: C = CN, ST = ZheJiang, L = HangZhou, O = Alibaba, OU = Inc, CN = www.cn.alibaba-inc.com
error 20 at 0 depth lookup:unable to get local issuer certificate
yunkai.zhang.pem: C = CN, ST = ZheJiang, L = HangZhou, O = Alibaba, OU = B2B-ITBU, CN = yunkai.zhang, emailAddress = yunkai...@alibaba-inc.com
error 20 at 0 depth lookup:unable to get local issuer certificate


2010/7/27 Fei Yan <skyscr...@gmail.com>

Wang Feng

unread,
Jul 27, 2010, 3:13:48 AM7/27/10
to pon...@googlegroups.com
2010/7/27 Chinainvent <chinain...@gmail.com>:

> 1. ca证书,是直接从firefox里导出来的,
>
> 2. 个人证书,是从IE导出来的pfx格式。

是不是文件格式问题? dos2unix一下看看。

Chinainvent

unread,
Jul 27, 2010, 4:20:03 AM7/27/10
to pon...@googlegroups.com
不会的,我的所有操作,都是在我的fedora13上进行的。

今天又细看了一遍https的握手过程,大家可以参考这里,从文中看,我说的这种情况,就属于“双向认证”的过程,大家在单向认证上,都有很丰富的经验,但使用双向认证,一般是不多见的。所以同学们的建议,大部分都基于猜测。

呼唤有真正成功经验的同学登场吧。。。

因为现在本人对证书认证、https的协议细节不熟,所以即使看源码,也需要先补上这两堂课。


2010/7/27 Wang Feng <wanng...@gmail.com>

Feng Shao

unread,
Jul 27, 2010, 11:05:55 AM7/27/10
to pon...@googlegroups.com


2010/7/27 Chinainvent <chinain...@gmail.com>

不会的,我的所有操作,都是在我的fedora13上进行的。

今天又细看了一遍https的握手过程,大家可以参考这里,从文中看,我说的这种情况,就属于“双向认证”的过程,大家在单向认证上,都有很丰富的经验,但使用双向认证,一般是不多见的。所以同学们的建议,大部分都基于猜测。

呼唤有真正成功经验的同学登场吧。。。
 
昨晚我用发给你那个帖子( http://curl.haxx.se/mail/archive-2005-09/0138.html )里面的方法试过,
我用的是startssl.com的客户端证书,从Firefox导出后文件扩展名是.p12 ,(PKCS)文件,
然后用链接中的三个命令,生成证书,
openssl pkcs12 -in MULTICERT.p12 -out ca.pem -cacerts -nokeys
openssl pkcs12 -in MULTICERT.p12 -out client.pem -clcerts -nokeys
openssl pkcs12 -in MULTICERT.p12 -out key.pem -nocerts

curl -v --key key.pem --cacert ca.pem --cert client.pem:xxxxxx https://www.somesite.com/page

命令就是这样的,你照着做看行不行。

Chinainvent

unread,
Jul 27, 2010, 10:51:44 PM7/27/10
to pon...@googlegroups.com
谢谢Feng,现在医院排队,我就是照你推荐的那个网址一模一样照做的,不过有你这成功的案例,也让我很欣喜了,回去我再试试:D

On 7/27/10, Feng Shao <seve...@gmail.com> wrote:
> 2010/7/27 Chinainvent <chinain...@gmail.com>
>
>> 不会的,我的所有操作,都是在我的fedora13上进行的。
>>

>> 今天又细看了一遍https的握手过程,大家可以参考这里<http://baike.baidu.com/view/14121.html?wtp=tt>


>> ,从文中看,我说的这种情况,就属于“双向认证”的过程,大家在单向认证上,都有很丰富的经验,但使用双向认证,一般是不多见的。所以同学们的建议,大部分都基于猜测。
>>
>> 呼唤有真正成功经验的同学登场吧。。。
>>
>
> 昨晚我用发给你那个帖子( http://curl.haxx.se/mail/archive-2005-09/0138.html )里面的方法试过,
> 我用的是startssl.com的客户端证书,从Firefox导出后文件扩展名是.p12 ,(PKCS)文件,
> 然后用链接中的三个命令,生成证书,
> openssl pkcs12 -in MULTICERT.p12 -out ca.pem -cacerts -nokeys
> openssl pkcs12 -in MULTICERT.p12 -out client.pem -clcerts -nokeys
> openssl pkcs12 -in MULTICERT.p12 -out key.pem -nocerts
>
> curl -v --key key.pem --cacert ca.pem --cert client.pem:xxxxxx
> https://www.somesite.com/page
>
> 命令就是这样的,你照着做看行不行。
>
>>
>> 因为现在本人对证书认证、https的协议细节不熟,所以即使看源码,也需要先补上这两堂课。
>>
>>
>> 2010/7/27 Wang Feng <wanng...@gmail.com>
>>
>> 2010/7/27 Chinainvent <chinain...@gmail.com>:
>>> > 1. ca证书,是直接从firefox里导出来的,
>>> >
>>> > 2. 个人证书,是从IE导出来的pfx格式。
>>>
>>> 是不是文件格式问题? dos2unix一下看看。
>>>
>>
>>
>>
>> --
>> Chinainvent
>> Blog: http://blog.csdn.net/chinainvent

>> Work at Alibaba <http://www.alibaba.com>
>>
>>
>

Work at Alibaba <http://www.alibaba.com>

Chinainvent

unread,
Jul 28, 2010, 3:37:03 AM7/28/10
to pon...@googlegroups.com
还是失败,原因在于,从firefox里导出的p12文件,只是client的公钥与私钥的合并体,你的例子中的MULITCERTS.p12是怎么来的呢?不可解出三者合一的东西呀。。。,

而对于我所关心的以司的这个内网:https://www.cn.alibaba-inc.com,我只能把公共证书的单独导出来并转成cacert.p12,但是当我把这三者一起使用时,就报出我前观邮件中提到的错误:

[yunkai@alibaba ~/itbu/https/tm]$ curl -v --key key.pem --cacert www.cn.alibaba-inc.com.pem --cert client.pem:hello123 https://www.cn.alibaba-inc.com
* About to connect() to www.cn.alibaba-inc.com port 443 (#0)
* Trying 121.0.17.70... connected
* Connected to www.cn.alibaba-inc.com (121.0.17.70) port 443 (#0)
* Initializing NSS with certpath: /etc/pki/nssdb
* CAfile: www.cn.alibaba-inc.com.pem
CApath: none
* Closing connection #0
* Out of memory
curl: (27) Out of memory 


2010/7/28 Chinainvent <chinain...@gmail.com>

Chinainvent

unread,
Jul 28, 2010, 3:38:13 AM7/28/10
to pon...@googlegroups.com
sorry,回复打字太快,有多处错字,希望不影响阅读:D

2010/7/28 Chinainvent <chinain...@gmail.com>

qiaojie

unread,
Jul 28, 2010, 3:59:16 AM7/28/10
to pon...@googlegroups.com
这种问题为啥不找你们公司的IT去解决?

 
2010/7/28 Chinainvent <chinain...@gmail.com>

何源

unread,
Jul 28, 2010, 11:46:09 PM7/28/10
to TopLanguage
p12证书应该是根证书、客户证书(内含客户公钥)、客户私钥组成的。由于有客户的密钥对,所以打包的时候都用DES3或加密算法加了密。
我觉得以上操作应该没有问题。要不您换一个版本的curl试试?


On 7月28日, 下午3时37分, Chinainvent <chinainvent....@gmail.com> wrote:
> 还是失败,原因在于,从firefox里导出的p12文件,只是client的公钥与私钥的合并体,你的例子中的MULITCERTS.p12是怎么来的呢?不 可解出三者合一的东西呀。。。,
>
> 而对于我所关心的以司的这个内网:https://www.cn.alibaba-inc.com
> ,我只能把公共证书的单独导出来并转成cacert.p12,但是当我把这三者一起使用时,就报出我前观邮件中提到的错误:
>

> [yunkai@alibaba ~/itbu/https/tm]$ curl -v --key key.pem --cacertwww.cn.alibaba-inc.com.pem--cert client.pem:hello123https://www.cn.alibaba-inc.com
> * About to connect() towww.cn.alibaba-inc.comport 443 (#0)
> * Trying 121.0.17.70... connected
> * Connected towww.cn.alibaba-inc.com(121.0.17.70) port 443 (#0)


> * Initializing NSS with certpath: /etc/pki/nssdb
> * CAfile:www.cn.alibaba-inc.com.pem
> CApath: none
> * Closing connection #0
> * Out of memory
> curl: (27) Out of memory
>

> 2010/7/28 Chinainvent <chinainvent....@gmail.com>


>
>
>
>
>
> > 谢谢Feng,现在医院排队,我就是照你推荐的那个网址一模一样照做的,不过有你这成功的案例,也让我很欣喜了,回去我再试试:D
>

> > On 7/27/10, Feng Shao <sevene...@gmail.com> wrote:
> > > 2010/7/27 Chinainvent <chinainvent....@gmail.com>


>
> > >> 不会的,我的所有操作,都是在我的fedora13上进行的。
>
> > >> 今天又细看了一遍https的握手过程,大家可以参考这里<
> >http://baike.baidu.com/view/14121.html?wtp=tt>
>
> > ,从文中看,我说的这种情况,就属于“双向认证”的过程,大家在单向认证上,都有很丰富的经验,但使用双向认证,一般是不多见的。所以同学们的建议,大部分都基 于猜测。
>
> > >> 呼唤有真正成功经验的同学登场吧。。。
>
> > > 昨晚我用发给你那个帖子(http://curl.haxx.se/mail/archive-2005-09/0138.html)里面的方法试过,
> > > 我用的是startssl.com的客户端证书,从Firefox导出后文件扩展名是.p12 ,(PKCS)文件,
> > > 然后用链接中的三个命令,生成证书,
> > > openssl pkcs12 -in MULTICERT.p12 -out ca.pem -cacerts -nokeys
> > > openssl pkcs12 -in MULTICERT.p12 -out client.pem -clcerts -nokeys
> > > openssl pkcs12 -in MULTICERT.p12 -out key.pem -nocerts
>
> > > curl -v --key key.pem --cacert ca.pem --cert client.pem:xxxxxx
> > >https://www.somesite.com/page
>
> > > 命令就是这样的,你照着做看行不行。
>
> > >> 因为现在本人对证书认证、https的协议细节不熟,所以即使看源码,也需要先补上这两堂课。
>

> > >> 2010/7/27 Wang Feng <wanng.fe...@gmail.com>
>
> > >> 2010/7/27 Chinainvent <chinainvent....@gmail.com>:


> > >>> > 1. ca证书,是直接从firefox里导出来的,
>
> > >>> > 2. 个人证书,是从IE导出来的pfx格式。
>
> > >>> 是不是文件格式问题? dos2unix一下看看。
>
> > >> --
> > >> Chinainvent
> > >> Blog:http://blog.csdn.net/chinainvent
> > >> Work at Alibaba <http://www.alibaba.com>
>
> > --
> > Chinainvent
> > Blog:http://blog.csdn.net/chinainvent
> > Work at Alibaba <http://www.alibaba.com>
>
> --
> Chinainvent
> Blog:http://blog.csdn.net/chinainvent

> Work at Alibaba <http://www.alibaba.com>

Chinainvent

unread,
Jul 29, 2010, 11:26:47 AM7/29/10
to pon...@googlegroups.com
我成功了!!!

一切原因,都在于fedura13上的libcurl库(直接从yum安装的,libcurl-7.20.1-3.fc13.i686)!真是折腾呀。

今天,从curl的官网上下载了curl的源码,然后打开-g选项,进行调试,一开始问题依旧,后来发现编译后的curl还是引到了系统安装的/usr/lib/libcurl.so.4,后面设置LD_LIBRARY_PATH,使curl引用本地编译的libcurl,刚才一试居然可以了!!!相当激动呀,这两天的努力算是没有白费。

不过,还是要感谢各位的回复,是你们给了偶力量:D

Thank you!!

2010/7/29 何源 <he.yuan...@gmail.com>

lxcypp

unread,
Jul 29, 2010, 11:37:48 AM7/29/10
to pon...@googlegroups.com

呵呵,还是ubuntu好,搞开发还是用u吧

在 2010-7-29 下午11:26,"Chinainvent" <chinain...@gmail.com>编写:



我成功了!!!

一切原因,都在于fedura13上的libcurl库(直接从yum安装的,libcurl-7.20.1-3.fc13.i686)!真是折腾呀。

今天,从curl的官网上下载了curl的源码,然后打开-g选项,进行调试,一开始问题依旧,后来发现编译后的curl还是引到了系统安装的/usr/lib/libcurl.so.4,后面设置LD_LIBRARY_PATH,使curl引用本地编译的libcurl,刚才一试居然可以了!!!相当激动呀,这两天的努力算是没有白费。

不过,还是要感谢各位的回复,是你们给了偶力量:D

Thank you!!


2010/7/29 何源 <he.yuan...@gmail.com>


>
> p12证书应该是根证书、客户证书(内含客户公钥)、客户私钥组成的。由于有客户的密钥对,所以打包的时候都用DES3或加密算法加了密。

> 我觉得以上操作应该没有问题。要不您换一个版本的curl...

Chinainvent

unread,
Jul 29, 2010, 11:46:19 AM7/29/10
to pon...@googlegroups.com
这跟u没有什么关系。。,任何人都会犯错。我曾经用u,因为服务都redhat,fedora的系统结构与redhat并无二致,图个较低的学习成本而已。

2010/7/29 lxcypp <lxc...@gmail.com>

lxcypp

unread,
Jul 29, 2010, 12:07:28 PM7/29/10
to pon...@googlegroups.com

不是想挑起战争,只是当年用rh7和fc1也是遇到过类似的与系统库有关的怪问题,跟踪了很久,浪费不少时间,后来换u就再没出过怪事了。
当然如果工作需要不得不用又另当别论

在 2010-7-29 下午11:46,"Chinainvent" <chinain...@gmail.com>编写:



这跟u没有什么关系。。,任何人都会犯错。我曾经用u,因为服务都redhat,fedora的系统结构与redhat并无二致,图个较低的学习成本而已。

2010/7/29 lxcypp <lxc...@gmail.com>


>
> 呵呵,还是ubuntu好,搞开发还是用u吧
>>
>> 在 2010-7-29 下午11:26,"Chinainvent" <chinain...@gmail.com>编写:

>>...

AlexNeko

unread,
Jul 29, 2010, 9:55:08 PM7/29/10
to pon...@googlegroups.com
ubuntu……现在越来越不适合开发了……    我不是想引战,只是说Ubuntu现在的发展重点在普通用户体验上了,开发的话gentoo和archlinux最顺手……   个人观点,可以无视

Chinainvent

unread,
Jul 29, 2010, 10:51:00 PM7/29/10
to pon...@googlegroups.com
刚把本主题讨论的问题,总结了一篇博客,感兴趣可以看看这里

ubuntu偏娱乐化,我个人喜欢fedora的简洁以及实验性——当然,因为fedora总在偿试最新的东西,也导致它的问题会多一些,但总要有人去试用一些未来的东西——这是进化的代价。

2010/7/30 AlexNeko <alexn...@gmail.com>
Reply all
Reply to author
Forward
0 new messages