SSL握手分析及常见问题排查

SSL握手分析及常见问题排查,第1张

        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配置不支持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证书不合法, 这时浏览器就会阻止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证书.

首先确保网站使用的是合法 CA 签发的有效证书,其次检查 Web Server 配置中证书的完整性(一定要包含站点证书及所有中间证书)。如果缺失了中间证书,部分浏览器能够自动获取但严重影响 TLS 握手性能;部分浏览器直接报证书错误。

如果只有老旧浏览器(例如 IE8 on Windows XP)提示这个错误,多半是因为你的服务器同时部署了使用不同证书的多个 HTTPS 站点,这样,不支持 SNI(Server Name Indication)的浏览器通常会获得错误的证书,从而无法访问。

要解决浏览器不支持 SNI 带来的问题,可以将使用不同证书的 HTTPS 站点部署在不同服务器上;还可以利用 SAN(Subject Alternative Name)机制将多个域名放入同一张证书;当然你也可以直接无视这些老旧浏览器。特别地,使用不支持 SNI 的浏览器访问商业 HTTPS CDN,基本都会因为证书错误而无法使用。

首先引入微信小程序官方关于HTTPS网络请求问题的 相关说明

如果苹果机型和本地微信开发工具请求都相对正常,唯独安卓部分机型频繁出现请求超时问题,那么可能就是服务器域名证书的信任链不完整或者缺失中间证书引发的,请对照下述流程检查或使用 SSL证书在线检测工具 。

微信小程序对证书要求如下:

原因:在部分安卓系统下证书不可信从而导致无法请求到数据。在证书文件的详细信息-授权信息访问一栏的 Alternative Name 中指定了中间证书的获取 URL 地址。IOS、MAC、Windows、都支持这种方式获取中间证书,唯独部分 Android 系统不支持,所以就无法建立可信连接。所以在切换小程序网络请求域名时请注意检查 SSL 证书是否配置正确。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/116992.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-13
下一篇2023-03-13

发表评论

登录后才能评论

评论列表(0条)

    保存