
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2017-09-05 标题【转】curl使用个人证书访问https站点分类编程【转】curl使用个人证书访问https站点本文转自【 http://blog.csdn.net/chary8088/article/details/22990741 】什么是https简单的说就是在SSL协议之上实现的http协议get、post等操作。什么是双向认证模式对于面向公众用户的https的网站大部分属于单向认证模式它不需要对客户端进行认证不需要提供客户端的个人证书例如https://www.google.com。而双向认证模式为了验证客户端的合法性要求客户端在访问服务器时出示自己的client certificate。以下为SSL握手过程①客户端的浏览器向服务器传送客户端 SSL 协议的版本号加密算法的种类产生的随机数以及其他服务器和客户端之间通讯所需要的各种信息。 ②服务器向客户端传送 SSL 协议的版本号加密算法的种类随机数以及其他相关信息同时服务器还将向客户端传送自己的证书。 ③客户利用服务器传过来的信息验证服务器的合法性服务器的合法性包括证书是否过期发行服务器证书的 CA 是否可靠发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过通讯将断开如果合法性验证通过将继续进行第四步。 ④用户端随机产生一个用于后面通讯的“对称密码”然后用服务器的公钥服务器的公钥从步骤②中的服务器的证书中获得对其加密然后将加密后的“预主密码”传给服务器。 ⑤如果服务器要求客户的身份认证在握手过程中为可选用户可以建立一个随机数然后对其进行数据签名将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。 ⑥如果服务器要求客户的身份认证服务器必须检验客户证书和签名随机数的合法性具体的合法性验证过程包括客户的证书使用日期是否有效为客户提供证书的CA 是否可靠发行CA 的公钥能否正确解开客户证书的发行 CA 的数字签名检查客户的证书是否在证书废止列表CRL中。检验如果没有通过通讯立刻中断如果验证通过服务器将用自己的私钥解开加密的“预主密码”然后执行一系列步骤来产生主通讯密码客户端也将通过同样的方法产生相同的主通讯密码。 ⑦服务器和客户端用相同的主密码即“通话密码”一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性防止数据通讯中的任何变化。 ⑧客户端向服务器端发出信息指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥同时通知服务器客户端的握手过程结束。 ⑨服务器向客户端发出信息指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥同时通知客户端服务器端的握手过程结束。 ⑩SSL 的握手部分结束SSL 安全通道的数据通讯开始客户和服务器开始使用相同的对称密钥进行数据通讯同时进行通讯完整性的检验。单向认证模式与双向认证模式的区别就在于第⑤、第⑥步是否要求对客户的身份认证。单向不需要认证双向需要认证。现在介绍如何使用curl来访问双向认证的https站点。一、准备工作首先因为要进行客户端认证你应该具有了客户端的个人证书对于公司内网通常是由IT的管理员颁发给你的只要你能够顺利的访问双向认证的https站点你就具有了个人证书它藏在浏览器上。我们要做的工作只是把它从浏览器中导出来。从浏览器导出来的格式通常为.pfx格式从firefox导出来的格式通常为.p12格式其实pfxp12它们是同一个东西对于curl而言这种格式称为PKCS#12文件。把p12格式转换为pem格式假设你的p12文件名为xxx.p12openssl pkcs12 -in xxx.p12 -out client.pem -nokeys #客户端个人证书的公钥openssl pkcs12 -in xxx.p12 -out key.pem -nocerts -nodes #客户端个人证书的私钥#也可以转换为公钥与私钥合二为一的文件openssl pkcs12 -in xxx.p12 -out all.pem -nodes #客户端公钥与私钥一起存在all.pem中在执行过程中可能需要你输入导出证书时设置的密码。执行成功后我们就有了这些文件client.pem——客户端公钥key.pem——客户端私钥或者二合一的all.pem。二、执行curl命令、使用client.pemkey.pemcurl -k --cert client.pem --key key.pem https://www.xxxx.com2、使用all.pemcurl -k --cert all.pem https://www.xxxx.com使用-k是不对服务器的证书进行检查这样就不必关心服务器证书的导出问题了。