Page 79 - Web性能权威指南
P. 79

4.7.6 证书链的长度

                 验证信任链需要浏览器遍历链条中的每个节点,从站点证书开始递归验证父证书,
                 直至信任的根证书。因此,优化的首要工作就是检查服务器在握手时没有忘记包含
                 所有中间证书。如果忘记了包含中间证书,虽然很多浏览器可以正常工作,但它们
                 会暂停验证并自己获取中间证书,验证之后再继续。此时很可能需要进行新 DNS 查
                 找、建立 TCP 连接、发送 HTTP GET 请求,导致握手多花几百 ms 时间。


                            浏览器怎么知道到哪里去找证书呢?子证书中通常包含父证书的 URL。



                 另一方面,还要确保信任链中不包含不必要的证书!或更一般化地讲,应该确保证
                 书链的长度最小。我们在 4.2 节“TLS 握手”中介绍过,服务器证书是在握手期间
                 发送的,而发送证书使用的很可能是一个处于 2.2.2 节“慢启动”算法初始阶段的
                 新 TCP 连接。如果证书链长度超过了 TCP 的初始拥塞窗口(图 4-11),那我们无意
                 间就会让握手多了一次往返:证书长度超过拥塞窗口,从而导致服务器停下来等待
                 客户端的 ACK 消息。














                 图 4-11:WireShark 的截图显示的 5323 字节的 TLS 证书链

                 图 4-11 所示的证书链超过了 5  KB,也超过了大多数旧版本浏览器的初始拥塞窗口
                 大小,因此会在握手期间增加一次额外的往返。对此,可以通过增大拥塞窗口来解
                 决,参见 2.2.2 节最后的“增大 TCP 的初始拥塞窗口”部分。此外,就是要看一看
                 能否减少要发送的证书大小了。

                 •   尽量减少中间证书颁发机构的数量。理想情况下,发送的证书链应该只包含两个
                   证书:站点证书和中间证书颁发机构的证书。把这一条作为选择证书颁发机构的
                   标准。第三个证书,也就是根证书颁发机构的证书,已经包含在浏览器内置的信
                   任名单中了,不用发送。
                 •   很多站点会在证书链中包含根证书颁发机构的证书,这是完全没有必要的。如果浏
                   览器的信任名单中没有该根证书,那说明它是不被信任的,即便发送它也无济于事。

                                                                     传输层安全(TLS)   |   61
   74   75   76   77   78   79   80   81   82   83   84