tomcat 7 + ssl无法正常工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH

时间:2015-05-08 12:33:47

标签: tomcat ssl

Ubuntu 14,tomcat 7,java 7

由godaddy提供的

our.crt,our.key和gd_bundle-g2-g1.crt。该捆绑包中有3个证书(通过查看文件可以看到)。

注意,我们的key和crt在node.js上使用没有问题。

我们从现有的crt创建了一个密钥库:

cd /etc/ssl
openssl pkcs12 -export -in our.crt -inkey our.key -out our.p12 -name tomcat -CAfile gd_bundle-g2-g1.crt -caname root -chain

server.xml是这样的:

<Server port="8005" shutdown="SHUTDOWN">

<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />



<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
          type="org.apache.catalina.UserDatabase"
          description="User database that can be updated and saved"
          factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>


<Service name="Catalina">

<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" />

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="200" scheme="https" secure="true"
           keystoreType="PKCS12"
           keystoreFile="/etc/ssl/our.p12" keystorePass=""
           clientAuth="false" sslProtocol="TLS" />
  • Tomcat启动时没有错误。
  • webapp在端口80上正常工作。
  • 服务器没有运行fw。

我们设置了从443到8443的本地重定向:

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

然后尝试https://www.ourserver.com/ourapp

Chrome提供:ERR_SSL_VERSION_OR_CIPHER_MISMATCH

卷曲在本地计算机上运行的示例:

curl -Iv https://www.ourserver.com:8443
* Rebuilt URL to: https://www.ourserver.com:8443/
* Hostname was NOT found in DNS cache
*   Trying 1xxxxxxxx...
* Connected to www.ourserver.com (1xxxx) port 8443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS alert, Server hello (2):
* error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

有什么想法吗?

更新1

我尝试在新服务器上设置一个新的tomcat 7,并安装了一份新的证书副本,并得到了同样的错误。

6 个答案:

答案 0 :(得分:17)

尝试将ciphers属性添加到连接器标记中,如

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"

如果这样做无效,请尝试将协议属性从protocol="HTTP/1.1"更改为protocol="org.apache.coyote.http11.Http11Protocol"

有关详情,请参阅see

答案 1 :(得分:3)

最近,当我找到Securing Bitbucket Server with Tomcat using SSL时,当我尝试关注指南this solution here时,我遇到了同样的错误。

您必须从pkcs12转换为java keystore格式:

keytool -importkeystore \
        -deststorepass changeit -destkeypass changeit \
        -destkeystore /path/to/my/keystore.jks \
        -srckeystore our.p12 -srcstoretype PKCS12

在Tomcat中,只需设置:

<Connector ...
          keystoreFile="/path/to/my/keystore.jks" />

答案 2 :(得分:2)

尝试将sslProtocol切换为&#34; TLSv1,TLSv1.1,TLSv1.2&#34;。您可能希望将SSLv2Hello添加到openssl / curl测试用例中,因为一些较旧的库希望在上行协商之前发送旧的hello。

答案 3 :(得分:1)

  

Ubuntu 14,tomcat 7,java 7

Tomcat和Java 7的确切版本是什么?

https://wiki.apache.org/tomcat/FAQ/Linux_Unix#Q5

  

server.xml是这样的:

您没有提到您正在使用的连接器实现,但是当从您的server.xml中删除AprLifecycleListener时,这意味着您正在使用“Http11Protocol”(又名“BIO”)实现。好。它应该从您的启动日志中可见。 (如果您使用过“APR”实现,那么您的配置必须完全不同。)

  

curl -Iv https://www.ourserver.com/ourapp:8443

奇怪的网址。端口号应遵循服务器名称https://www.ourserver.com:8443/ourapp

虽然来自curl的消息“*重建网址:https://www.ourserver.com:8443/”看起来好像知道如何处理。

  

错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败

由于已发布的SSL漏洞(CVE-2014-3566 POODLE),Tomcat 7.0.57及更高版本默认禁用SSLv3协议。过滤SSL协议会禁用所有协议,其名称中包含“SSL”,包括SSLv2Hello。显然curl尝试在这里连接SSLv2Hello握手(其消息中为“SSL23”)。

您需要一个支持TLS协议的客户端(TLS 1.0,1.1或1.2)。

https://wiki.apache.org/tomcat/Security/POODLE
https://wiki.apache.org/tomcat/Security/Ciphers

  

尝试将sslProtocol切换为“TLSv1,TLSv1.1,TLSv1.2”。您可能希望将SSLv2Hello添加到openssl / curl测试用例中,因为一些较旧的库希望在上行协商之前发送旧的hello。

很好,但只有一次更正:以上是sslEnabledProtocols属性的值(不是sslProtocol)。

您可以尝试连接OpenSSL,

openssl s_client -connect hostname:8443

openssl s_client -connect hostname:8443 -tls1

OpenSSL Doc:https://openssl.org/docs/apps/s_client.html

Tomcat 7配置参考:http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#SSL_Support_-_BIO_and_NIO

答案 4 :(得分:1)

它需要以.jks格式的文件创建证书。

密钥生成

1)在Java上输入密钥生成命令

keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore your_domain_name.jks

2)运行CSR命令

keytool -certreq -alias server -file csr.txt -keystore your_domain_name.jks

3)在Godaddy.com上提交crs.txt

安装说明

1)转换您的证书文件。它需要openssl(https://www.openssl.org/) 运行命令:xxx.pem来自证书文件(您的域名cert)

openssl crl2pkcs7 -nocrl -certfile xxx.pem -out your_file_name.p7b -certfile gd_bundle-g2-g1.crt

2)在Java上运行Install命令

keytool -import -trustcacerts -alias server -file your_file_name.p7b -keystore your_domain_name.jks

4)打开.. \ Apache Software Foundation \ Tomcat 7.0 \ conf中的server.xml文件。 更新连接器设置。

<Connector 
       port="443"  
       scheme="https" 
       secure="true" 
       SSLEnabled="true" 
       clientAuth="false"
       sslProtocol="TLS" 
       keyAlias="server"  
       keystoreFile="/home/user_name/your_domain_name.jks"
       keystorePass="your_keystore_password"
 />

5)不客气。

答案 5 :(得分:0)

我遇到了同样的问题,我解决了。

请向您的密钥库添加密码-可以!