如何排查Chromium内核浏览器访问Oracle APEX站点出现ERR_CONNECTION_RESET故障
问题根因
该问题由以下几个叠加因素触发:
- Windows Server 2016 原生Schannel组件对通配符证书的TLS握手响应打包逻辑存在缺陷,包含完整证书链的通配符证书响应包大小会超出部分Chromium内核版本的默认接收阈值,触发连接重置
- Chromium内核针对通配符证书的CT(证书透明度)校验规则远严格于Firefox、IE,部分通配符证书未携带完整SCT(签名证书时间戳)时,Chromium会主动断开连接
- 旧版本Tomcat在Windows平台下的SSL Connector对SNI扩展的响应逻辑存在bug,会给部分未携带SNI扩展或者SNI匹配规则异常的Chromium客户端返回错误的握手响应,触发连接重置
之前测试启用Fiddler后访问正常,是因为Fiddler会替换站点证书、拆分TLS响应包,刚好规避了上述问题;替换为单域名证书后恢复正常,是因为单域名证书的响应包大小远小于通配符证书,不会触发大小阈值校验,且单域名证书的CT校验规则更宽松。
修复方案
- 优先升级Tomcat到对应分支的最新稳定版:Tomcat 8.5.x升级到8.5.85+,Tomcat 9.x升级到9.0.70+,Tomcat 10.x升级到10.1.5+,旧版本的SSL Connector存在多个和通配符证书、Windows Schannel适配相关的已知bug
- 调整Tomcat的SSL Connector配置,修改
conf/server.xml中对应SSL端口的配置项:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig sslProtocol="TLSv1.2" sendCertChainSct="true" maxSslRecordSize="1400"> <Certificate certificateKeystoreFile="你的通配符证书keystore路径" certificateKeystorePassword="你的keystore密码" type="RSA" /> </SSLHostConfig> </Connector>
核心新增参数说明:
sendCertChainSct="true":强制Tomcat下发证书附带的SCT信息,满足Chromium的CT校验要求(需Tomcat 9.0.38+/8.5.58+版本支持)maxSslRecordSize="1400":降低TLS记录最大大小,避免大包触发Chromium的接收阈值,同时兼容各类网络中间设备的MTU限制- 如果上述配置调整后仍存在问题,可以将Tomcat的SSL实现从默认的JSSE切换到OpenSSL实现,Windows平台下可以通过安装Tomcat Native组件启用OpenSSL,OpenSSL对通配符证书的打包逻辑和Windows Schannel不同,可规避原生系统组件的缺陷
验证方式
调整配置重启Tomcat后,使用之前无法访问的Chromium内核浏览器清理缓存后访问即可验证效果。
内容的提问来源于stack exchange,提问作者Paul Stearns
相关产品推荐
相关产品推荐

