如何解决Tomcat 10 SSL协议配置错误及版本与密码套件不匹配问题
解决Tomcat 10 SSL配置问题
一、修复SSL版本与密码套件不匹配错误
你的配置存在几个关键问题,直接导致ERR_SSL_VERSION_OR_CIPHER_MISMATCH错误:
- 密码套件配置截断:
<SSLHostConfig>的ciphers属性中TLS_ECDHE开头的套件名称不完整,且包含已废弃的不安全套件SSL_RSA_WITH_RC4_128_SHA。 - 证书重复配置:
<Connector>和<SSLHostConfig>下同时配置了证书,Tomcat 10推荐统一在<SSLHostConfig>的<Certificate>节点中配置,避免冲突。 - 套件兼容性不足:现有套件未覆盖现代主流客户端支持的安全套件组合。
修正操作:
- 移除
<Connector>节点下的SSLCertificateFile和SSLCertificateKeyFile属性。 - 替换
ciphers属性值为完整、安全的TLS 1.2兼容套件:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384 - 保留
sslEnabledProtocols="TLSv1.2",若需兼容更多客户端,可追加TLSv1.3(Tomcat 10原生支持)。
二、解决Http11AprProtocol不支持问题
Http11AprProtocol依赖APR(Apache Portable Runtime)库,Tomcat默认未内置该库,直接切换会报错:
- 若无需APR协议,继续使用
Http11NioProtocol即可,它是Tomcat默认NIO协议,性能满足大多数场景。 - 若一定要启用APR,需:
- 下载对应操作系统的APR原生库(Windows为
tcnative-1.dll,Linux为libtcnative-1.so)。 - 将库文件放入Tomcat的
bin目录或系统默认库路径。 - 重启Tomcat后再切换协议为
org.apache.coyote.http11.Http11AprProtocol。
- 下载对应操作系统的APR原生库(Windows为
修正后的完整配置示例
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" minSpareThreads="25" SSLEnabled="true" sslEnabledProtocols="TLSv1.2" scheme="https" secure="true" enableLookups="false" disableUploadTimeout="true" acceptCount="400" URIEncoding="UTF-8" clientAuth="false" defaultSSLHostConfigName="abx.io" connectionTimeout="20000"> <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/> <SSLHostConfig hostName="abx.io" ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384"> <Certificate certificateFile="conf/cert_abx/cert.pem" certificateKeyFile="conf/cert_abx/privkey.pem" certificateChainFile="conf/cert_abx/chain.pem"/> </SSLHostConfig> </Connector>
验证方法
修改配置后重启Tomcat,通过浏览器访问https://abx.io:8443,或执行openssl s_client -connect abx.io:8443命令,确认SSL连接正常协商。
内容的提问来源于stack exchange,提问作者Ullas Hunka
相关产品推荐
相关产品推荐

