Chrome偶现ERR_SSL_PROTOCOL_ERROR,F5可恢复,求排查思路
偶发ERR_SSL_PROTOCOL_ERROR问题排查方案
结合你描述的环境(IIS 2016 + ASP.NET + 负载均衡 + Forti ADC强制HTTPS)和抓包显示的服务器Hello解密错误,这种仅部分Chrome用户偶发、刷新即好的问题,大概率和SSL握手链路中的配置冲突或会话异常有关,以下是具体排查思路:
1. 检查负载均衡与Forti ADC的SSL处理逻辑冲突
你提到请求先经负载均衡再到防火墙,而Forti ADC又强制HTTPS并配置了通配符证书。这里要确认:
- 负载均衡是否也开启了SSL卸载?如果负载均衡已经解密HTTPS请求,再转发给Forti ADC时用HTTP,而防火墙又强制转HTTPS,就可能出现重复加密/解密的握手混乱,偶发触发协议错误。
- 两端的SSL协议版本、加密套件(Cipher Suite)是否对齐?比如负载均衡默认启用了TLS 1.0/1.1,而Chrome现在优先TLS 1.2/1.3,第一次握手协商了不兼容的套件导致失败,刷新时重新协商匹配的套件就恢复正常。
2. 排查Forti ADC的SSL会话复用配置
防火墙的SSL会话复用功能如果配置不当,也会导致偶发的握手失败:
- 检查Forti ADC的
ssl session-cache相关设置,比如会话超时时间是否过短,或者复用规则是否和Chrome的会话缓存逻辑不兼容。部分客户端第一次请求时复用了失效的会话,触发解密错误,刷新时重新建立新会话就正常了。 - 可以临时关闭SSL会话复用功能,观察问题是否消失,以此验证是否是复用导致的问题。
3. 验证IIS的SSL配置兼容性
虽然站点基于ASP.NET,但IIS底层的SSL设置可能存在兼容性问题:
- 检查Windows Server 2016的IIS是否启用了Chrome支持的TLS版本(建议仅保留TLS 1.2和TLS 1.3),禁用老旧的TLS 1.0/1.1。可以通过服务器管理器的「Internet Information Services (IIS) Manager」-> 站点 -> 绑定 -> 编辑SSL设置,或用PowerShell命令调整:
# 启用TLS 1.2和1.3 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value 1 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name 'Enabled' -Value 1 - 确认IIS的加密套件是否包含Chrome推荐的套件(比如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384等),避免使用Chrome已弃用的弱加密套件。
4. 检查证书链与OCSP Stapling配置
即使更换了新证书,证书链不完整或OCSP响应异常也会导致偶发验证失败:
- 用
openssl s_client -connect all.xxx.sites:443命令多次测试,检查返回的证书链是否包含完整的根证书和中间证书。如果偶发出现链不完整的情况,说明防火墙或IIS的证书链配置有问题,部分客户端第一次请求时无法获取中间证书,验证失败,刷新时缓存了证书链就恢复了。 - 检查IIS是否开启了OCSP Stapling,如果OCSP服务器响应不稳定,第一次请求时OCSP验证超时失败,刷新时使用了缓存的OCSP响应就正常了。可以在IIS的SSL设置中关闭OCSP Stapling,观察问题是否消失。
5. 定位抓包中的解密错误节点
你提到Wireshark抓包显示服务器Hello响应有解密错误告警,需要进一步定位:
- 确认解密错误是客户端Chrome解密服务器Hello失败,还是防火墙/负载均衡/IIS解密客户端请求失败。如果是客户端侧,可能是Chrome的特定版本对某些SSL扩展字段不兼容;如果是服务器侧,可能是某个节点的SSL设备在生成服务器Hello时存在异常(比如自定义扩展不符合规范)。
- 可以在出现问题的Chrome客户端上开启SSL日志(chrome://net-internals/#ssl),查看详细的握手日志,找到具体的错误原因(比如协议版本不支持、套件协商失败、证书验证失败等)。
6. 排查负载均衡的后端分发逻辑
如果负载均衡配置了多台IIS后端实例,可能存在某台实例的SSL配置异常:
- 检查负载均衡的后端实例健康状态,是否有实例偶发处于不健康状态,第一次请求被分发到异常实例导致错误,刷新时负载均衡分发到正常实例就恢复了。
- 可以临时将负载均衡设置为固定分发到某一台实例,观察问题是否复现,以此排查是否是单台实例的配置问题。
内容的提问来源于stack exchange,提问作者Luis Abreu
相关产品推荐
相关产品推荐

