如何在Tomcat 7服务器上修复“ssl_error_no_cypher_overlap”?

时间:2015-04-04 18:28:19

标签: java tomcat ssl

由于POODLE vulnerability,最新版本的Chrome和Firefox默认禁用了SSLv3.0。当我尝试打开我已经设置的网站(并且工作正常)时,这会导致以下错误:

使用Chrome:

A secure connection cannot be established because this site uses an unsupported protocol.
Error code: ERR_SSL_VERSION_OR_CIPHER_MISMATCH

使用Firefox:

Cannot communicate securely with peer: no common encryption algorithm(s). (Error code: ssl_error_no_cypher_overlap) 

我研究过这个问题with ChromeFirefoxTomcatmore Tomcat docs。我理解这个问题,但我找不到文档来配置Tomcat 7只使用现在安全的TLS密码和协议。我不确定是否需要创建新的cert / keypair,更改我的server.xml,或安装新版本的Tomcat,或者是什么。我甚至不确定现在考虑哪些版本的密码/协议"可接受"通过这些浏览器。任何人都可以指向我的文档或示例设置吗?

我在Ubuntu 14.04上使用OpenJDK 1.7和Tomcat 7。

这是我的证书文件(编辑):

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: something
Creation date: May 4, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=something, OU=something, O=something, L=something, ST=something, C=something
Issuer: CN=something, OU=something, O=something, L=something, ST=something, C=something
Serial number: ...
Valid from: Sat May 04 17:28:21 MST 2013 until: Tue May 02 17:28:21 MST 2023
Certificate fingerprints:
     MD5:  ...
     SHA1: ...
     SHA256: ...
     Signature algorithm name: SHA1withDSA
     Version: 3

这是我的server.xml HTTPS支持条目:

<Connector port="8484" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="/path/mykeystore"  
           keystorePass="password"
           clientAuth="false" 
           sslProtocol="TLS"
           sslEnabledProtocols="TLS" />

3 个答案:

答案 0 :(得分:16)

我在使用Tomcat 8.0.23和Java 8 build 1.8.0_45的新安装上遇到了问题。我终于发现,当我使用Java keytool实用程序创建自签名证书时,我未能指定 -keyalg RSA 选项。我删除了旧的密钥库,并确保在创建新的密钥库时包含该选项。这解决了问题。

答案 1 :(得分:3)

完整的Tomcat server.xml连接器元素:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="conf/keystore.jks" keystorePass="changeit"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA" />

这对我有用,我也在使用JRE1.7和Tomcat7服务器。但设置sslEnabledProtocols对我来说不起作用,这里使用sslProtocol =&#34; TLS&#34;相反,并明确指定加密算法。

答案 2 :(得分:0)

您需要扩展sslEnabledProtocols以包含TLSv1和ff,具体取决于您的Java版本。

您使用ciphers element of the connector指定密码。

与证书无关。