https是在SSL协议之上实现的http协议(get、post等操作)。
介绍一下ssl的握手过程:
①客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
②服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。
③客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。
④用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。
⑤如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。
⑥如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的CA 是否可靠,发行CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。
⑦服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。
⑧客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
⑨服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
⑩SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。
单向认证模式:
对于面向公众用户的https的网站,大部分属于这种,它不需要对客户端进行认证,不需要提供客户端的个人证书,例如https://www.google.com。
双向认证模式:
为了验证客户端的合法性,要求客户端在访问服务器时,出示自己的被授权过的客户端证书。
如果在linux下开发应用的话,可以借助curl这个命令行工具,它提供命令行操作方式、libcurl库函数使用方式。
CURL对HTTPS的支持是通过
--cacert, --capath, --with-ca-bundle
等参数来对HTTPS加以支持的,详细信息可以
curl --help
来得到参数明细。
http://curl.haxx.se/docs/sslcerts.html是curl的官方文档介绍,其中讲了如何导入CA的具体方法,以及使用CA的方法。
其中--with-ca-bundle可以用环境变量CURL_CA_BUNDLE(LINUX下)或curl-ca-bundle.crt(WINDOWS下可搜索到该文件)来实现默认指定。
如果在linux下开发应用的话,可以借助curl这个命令行工具,它提供命令行操作方式、libcurl库函数使用方式。
下面讲讲https的证书:
通过IE或其他浏览器访问HTTPS服务器我们可以很容易得到SSL的X.509安全证书,证书导出可以选择编码格式,我们通常选择DER或者BASE64编码方法,导出文件为cer后缀。需要注意的是对于openssl生成crt证书文件时--info参数会有区别。如对DER编码文件命令应该是
openssl x509 -inform DES -in /aaa-der.cer -text -out /.aaa-der.crt
其中aaa-der.cer是浏览器里导出的x.509证书文件,aaa-der.crt是加密CA证书被curl所需加载验证的。如果导出用BASE64编码导出的,则命令行应该改为
openssl x509 -inform PEM -in /aaa-b64.cer -text -out /.aaa-b64.crt
其中-inform参数需要改为PEM,来对应编码格式BASE64。
用在curl时需作为--capath的参数值代入才能生效; 反之,如果只有两层的,即除了底层的URL外,上面只有一层的,则说明该证书只是一个证书,用在curl里需作为--cacert里的参数值才能生效。
证书在curl里能被通过必须具备以下三个条件:
1、被CA签证过的证书;
2、期限有效的;
3、URL能匹配请求。
其中第三个可以用过hosts添加ip-name对来实现欺骗,如果服务器的SSL证书属于复制使用的话。
用curl访问https网址的命令:
curl -k https://www.xxxx.com
注意-k的目的就是让curl不对服务器的https证书认证。
现在介绍如何使用curl来访问双向认证的https站点。
一、准备工作
1、首先,因为要进行客户端认证,你应该具有了客户端的个人证书(对于公司内网,通常是由IT的管理员颁发给你的),只要你能够顺利的访问双向认证的https站点,你就具有了个人证书,它藏在浏览器上。我们要做的工作,只是把它从浏览器中导出来。从IE浏览器导出来的格式,通常为.pfx格式,从firefox导出来的格式通常为.p12格式,其实pfx=p12,它们是同一个东西,对于curl而言这种格式称为PKCS#12文件。
2、把p12格式转换为pem格式(假设你的p12文件名为:xxx.p12):
openssl 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命令
1、使用client.pem+key.pem
curl -k --cert client.pem --key key.pem https://www.xxxx.com
2、使用all.pem
curl -k --cert all.pem https://www.xxxx.com
使用-k,是不对服务器的证书进行检查,这样就不必关心服务器证书的导出问题。
本文参考http://dannyyuan.blog.51cto.com/212520/124957/
本文参考http://blog.csdn.net/chinainvent/article/details/5775786