本文旨在总结一下本人在HTTPS请求过程中遇到的一些问题,说一说自己的心得。
HTTPS就是基于SSL/TLS的HTTP请求,也就是在HTTP和TCP之间加了一层SSL/TLS,用于数据的加密,加强通讯的安全。SSL加密的握手过程如下:
1、客户端请求服务端;
2、服务端响应客户端,并向客户端下发自己的证书;
3、客户端验证服务端下发的证书,验证成功,取出证书中的公钥;
4、之后客户端和服务端还有一些交互,会产生3个随机数,这3个随机数又会生成一个临时密钥,用来加密之后要传输的数据;
5、临时密钥产生之后,接下来就会正式进行http的会话
这个过程中,就我本人遇到的困惑以及解决办法,这里进行一下简单讲解:
1、客户端如何验证服务器下发的证书?
这个问题没什么神秘的,客户端怎么验证服务器下发的证书呢,其实进行https请求,客户端都是已经安装了一个证书的,这个证书用来验证服务端下发的证书。客户端的证书是CA证书,里面是CA的公钥,服务端下发的证书是CA用私钥签过名的,验证的方法就是用CA的公钥解密,拿到服务器的证书就OK了。
2、SSL双向验证是怎么回事?
对于安全要求不高的https,一般都是单向验证,大多数单向验证都是客户端验证服务端证书,当然也有例外,比如我在一个项目中,请求别人家的服务器,竟然不要求客户单验证服务端的证书,而是服务端验证客户端的证书。对于安全要求高的,会进行双向认证,即客户端验证服务端的证书,服务端的证书也会验证客户端的证书。
3、客户端证书的格式应该是什么格式?
android设备中一般为CRT格式,普通的java客户端为jks格式。