SSL握手分析及常见问题排查
SSL握手过程
1. 当要建立一个tls加密的连接时.客户端首先发送一个client hello消息给服务端,其中包含了一个客户端生成的随机数 random_1, 客户端支持的加密套件(support ciphers), 以及支持的tls版本等信息;
2. 服务端收到了客户端的请求时,会从client hello消息中取出随机数random_1, 客户端的加密套件等信息,确定使用哪一种加密套件,以及再生成一个随机数random_2, 并将这些信息包含在server hello消息中发送给客户端;然后服务端还会将自己的证书信息发送给客户端.
3. 客户端收到服务服务端的消息和证书后,会从中取出服务端生成的随机数random_2,以及确定的加密套件等信息.并将服务端下发的证书拿到自己系统里的CA列表中进行验证,验证合法后从证书中取出服务端的公钥, 再生成一个随机数random_3.并用服务端的公钥对random_3进行加密生成一个key发给服务端.
4. 服务端收到客户端发来的key之后,用自己的私钥对其解密,取出随机数random_3.
5. 至此,客户端和服务端都拥有了random_1, random_2, random_3三个随机数,以及确定了相同的加密套件.现在只要根据相同的加密算法对这三个随机数进行加密生成一个密钥,服务端和客户端就拥有了这个相同的密钥.此后的连接中,服务端和客户端都使用这个密钥对信息进行加密,就可以通过这种对称加密的方式进行密文传输了.
6. 我们可以发现,在服务端和客户端交换随机数的时候,是通过服务端向客户端下发公钥以非对称加密的形式完成的.当服务端和客户端都拿到了相同的三个随机数后,用这三个随机数生成了相同的密钥,此后的通信就是通过这个密钥加密和解密信息,实现了对称加密传输.
一些导致tls握手失败的原因
由客户端带来的问题以及解决方案
通常tls握手失败都是由服务端以及服务端tls配置问题导致的.
目前最主要的原因就是服务端的tls配置不支持ssl3.0.但是,客户端这边的问题也很有可能会导致的tls握手失败.比如,像系统时间不正确,或者浏览器更新所至等一些常见的客户端问题.
系统时间错误
服务端导致的问题及解决方案
大部分情况下, tls握手失败都是由服务端问题所导致的. 其中有些问题很容易解决, 有些问题不容易解决,甚至有一些问题不值得去解决.
协议不匹配
* 客户端支持tls1.0和tls1.1版本,但服务端只支持tls1.2
上面这个例子就是tls协议不匹配.但是,在这种情况下,要修复这个问题,不应该是服务端来匹配低版本的协议,而应该是客户端升级到tls1.2来匹配服务端较新的协议. 在目前,我们的建议是必须支持tls1.2和tls1.3协议,对于还不支持的网站必须添加上这两个版本.
加密套件不匹配
tls/ssl并不是通过一个通过自身可以解决所有问题的算法,而是一系列不同算法的结合,不同的算法用以实现不同的功能,它们结合在一起组成了tls/ssl.
tls1.3版本的加密套件得到了进一步的完善.在这之前, 加密套件的算法主要包含以下功能:
* 对称密钥会话加密(Symmetric Session Key Encryption)
* 非对称公钥加密(Asymmetric Public Key Encryption)
* 证书签名哈希(Signature Hashing)
* 密钥生成(Key Generation)
tls/ssl证书错误
许多原因都会导致浏览器判定tls证书不合法, 这时浏览器就会阻止tls握手连接. 在接下来的小节中, 我们会深入探讨由于此类技术问题所引发的tls握手失败问题.
* 域名不匹配: 网站域名与证书中的不相匹配.
* 证书链不正确: 证书链中缺少中间证书.
* 证书过期或被撤销: 服务端使用了不受信任, 过期, 或被撤销的tls证书.
* 使用自签名证书: 使用自签名证书或内部网络路径混乱
域名错误
在以前,一个网站的非www域名和www域名之间存在着问题,但是后来证书颁发机构允许一个证书可以签发多个子域名(SAN),已经几乎解决了这个问题.处理证书域名错误的最好方法就是从新签发一个新证书,或者使用通配符证书.
证书链不正确
SL/TLS和PKI信任模型通常依赖于根程序(Root program),这是存储在计算机系统上的受信任CA根证书的集合。其中一些根程序例如:
* 火狐浏览器使用的Mozilla根程序.
* 安卓系统使用的Google根程序.
* IOS和macOS系统所使用的Apple根程序.
* Windows系统使用的Microsoft根程序.
CA根程序十分重要,虽然它不直接签发证书,但证书机构会利用中间根证书来签发终端用户所使用的tls叶证书. 这就是证书链的运作方式, CA根证书被用来签发中间根, 中间根又用来签发其他中间根, 最终直到终端用户的tls叶证书.
证书过期或被注销
当前,tls证书的最大有效期是2年. 因此,如果你的证书过期或者因为某些原因被注销了,将会导致tls握手失败的错误.解决方法是重新购买和安装一份合法的证书.
使用自签名证书
如果你的暴露在公网上的网站使用的是自签名证书,这是不被信任的,将会导致错误. 要解决这个错误,你需要去一个受信任的CA机构重新签署一份tls证书.