游客发表
把 TLS 1.1 和 TLS 1.2 都勾上,启用浏览器还是和s还转圈,最后甩出一句“无法访问此网站”。开网这事我上周就碰上了,启用折腾到半夜,和s还发现根子根本不在协议版本上。开网
那台 Windows 7 的启用老机器,IE 11 连公司内网 OA 都打不开。和s还我第一反应就是开网协议太旧,服务器可能只认 TLS 1.2。启用进“Internet 选项”→“高级”,和s还把 TLS 1.1、开网TLS 1.2 全打钩,启用顺手把 SSL 3.0 和 TLS 1.0 取消。和s还重启浏览器,开网没用。又去注册表里翻 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\SecureProtocols,数值改成 0xA80,对应 TLS 1.1+1.2。重启,还是打不开。
问题出在一个很多人会忽略的地方:加密套件。TLS 握手不光看版本号,还要看双方能不能谈拢一套密码算法。服务器如果只支持 ECDHE 密钥交换,而你这台 Win7 默认的加密套件列表里压根没有 ECDHE,版本号勾得再全也是白搭。我抓了个包,Client Hello 发出去,Server Hello 直接不回,TCP 层就断了。用 Wireshark 看,连 Alert 都没发,说明服务器在更底层就拒了。
怎么确认?用 openssl s_client -connect example.com:443 -tls1_2 试。如果报 handshake failure 或者 no shared cipher,那就跟协议版本没关系了。我当时跑这条命令,返回的是 sslv3 alert handshake failure,服务器端直接说“咱俩没共同语言”。
Win7 的 Schannel 默认套件列表确实老。微软在 KB3042058 里补过一批,但很多机器没打。手动加 ECDHE 套件得改注册表,路径在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002,把 Functions 键里的字符串改成包含 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 这类条目。改完重启,再试,通了。
另一个坑是系统根证书。有些服务器用 Let's Encrypt 或者自签 CA,Win7 的根证书库不更新,TLS 握手到证书验证那步就断。浏览器报错可能含糊其辞,说“连接不安全”或者直接白屏。你可以在 certmgr.msc 里看“受信任的根证书颁发机构”,缺哪个补哪个。我那次是服务器换了 DigiCert 的新根,Win7 没自动更新,手动导入后才好。
还有一次更邪门:协议勾了,套件也加了,证书也导了,还是打不开。最后发现是杀毒软件的 HTTPS 扫描在中间插了一脚。它自己扮演中间人,但它的 TLS 栈只支持到 TLS 1.0,浏览器和它谈 TLS 1.2,它和服务器谈 TLS 1.0,服务器不干,整个链路就崩了。把 Avast 的“扫描 HTTPS 流量”关掉,立刻正常。这种问题最难查,因为浏览器地址栏看起来一切正常,抓包才能看到两个不同的 TLS 会话。
所以下次再遇到“启用了 TLS 1.1 和 1.2 还是打不开网页”,别只盯着版本号。先 openssl s_client 看握手到底卡在哪一步,是套件不匹配、证书链断裂,还是中间有东西在捣乱。协议版本只是入场券,进了门还得看你能不能跟对方说上话。
友情链接