tomcat 7 + ssl 不工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Posted

技术标签:

【中文标题】tomcat 7 + ssl 不工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH【英文标题】:tomcat 7 + ssl not working - ERR_SSL_VERSION_OR_CIPHER_MISMATCH 【发布时间】:2015-07-19 09:06:58 【问题描述】:

Ubuntu 14、tomcat 7、java 7

our.crt、our.key 和 gd_bundle-g2-g1.crt 由 godaddy 提供。捆绑包中有 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 上运行良好。 服务器没有运行任何固件。

我们设置了一个从 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 示例:

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,并安装了新的证书副本,但遇到了同样的错误。

【问题讨论】:

由于此“握手失败”警报是由服务器发送的,因此在调试问题时应查看服务器端,即查看来自 tomcat 的日志消息。 遗憾的是,catalina.out 中没有错误 localhost.* 或其他 tomcat 日志文件中是否有任何错误? localhost_access_log.yyyy-mm-dd 在我点击 SSL 端口并在 chrome 中返回 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 消息时没有条目 为什么不在 Apache Web Server 后面运行它? 【参考方案1】:

尝试将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

【讨论】:

感谢您查看此内容。我找到了类似的参考并尝试设置密码,但这没有帮助。我刚刚尝试了你找到的那些,重新启动了 tomcat,但不幸的是得到了相同的 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误。 刚刚按照您的建议尝试了 org.apache.coyote.http11.Http11Protocol。不幸的是,这也无济于事。 如果这个答案对 OP 没有帮助,为什么会得到赏金? 这个答案解决了大多数“ERR_SSL_VERSION_OR_CIPHER_MISMATCH”错误 这对我有用的密码。对于从 Windows 迁移到 Linux 的人来说是可怕的。当你复制粘贴 server.xml 并打破你的头脑思考什么是错的时候【参考方案2】:

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

【讨论】:

嗨,谢谢你的想法 - 我试过这个,但给出了同样的错误。【参考方案3】:

Ubuntu 14、tomcat 7、java 7

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

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

server.xml 是这样的:

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

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

一个奇怪的 URL。端口号应跟在服务器名称之后,https://www.ourserver.com:8443/ourapp

虽然来自 curl 的消息“* Rebuilt URL to: https://www.ourserver.com:8443/”看起来知道如何处理。

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

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

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

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

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

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

您可以尝试使用 OpenSSL 进行连接,

openssl s_client -connect hostname:8443

openssl s_client -connect hostname:8443 -tls1

OpenSSL 文档: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

【讨论】:

服务器版本:Apache Tomcat/7.0.52 (Ubuntu) 服务器构建:2014 年 7 月 24 日 08:38:51 服务器编号:7.0.52.0 操作系统名称:Linux 操作系统版本:3.13.0-30-通用架构:amd64 JVM 版本:1.7.0_75-b13 不幸的是,我无法真正更改客户端 - Chrome、IE、curl 和 openssl 中出现相同的错误。 openssl s_client -connect hostname:8443: CONNECTED(00000003) depth=3 C = US, O = "The Go Daddy Group, Inc.", OU = Go Daddy Class 2 证书颁发机构验证错误: num=19:证书链中的自签名证书验证返回:0 --- 证书链 0 s:/OU=Domain Control Validated/CN=*.respingaming.net i:/C=US/ST=Arizona/L=Scottsdale /O=GoDaddy.com, Inc./OU=certs.godaddy.com/repository//CN=GoDaddy 安全证书颁发机构 - G2: openssl s_client -connect hostname:8443 在第二台服务器上设置相同(至少应该是,但我尝试了很多变体)给出:root@pansy:~# openssl s_client -connect localhost:8443 CONNECTED(00000003) 139957150750368:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:770:---没有可用的对等证书---没有发送客户端证书CA名称---SSL握手已读取 7 个字节并写入 305 个字节 --- 新,(无),密码为(无) 不支持安全重新协商 压缩:无 扩展:无 --- 尝试将“-tls1”参数添加到 openssl s_client 命令(我更新了上面的配方)。 7.0.52 有点老了。您需要查看我提到的禁用 SSLv3 的常见问题解答条目。【参考方案4】:

最近我遇到了同样的错误,当我试图按照指南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" />

【讨论】:

【参考方案5】:

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

请为您的密钥库添加一个密码 - 它可以工作!

【讨论】:

【参考方案6】:

需要在.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 来自证书文件(你的域名证书)

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

2) 在 Java 中运行安装命令

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) 不客气。

【讨论】:

以上是关于tomcat 7 + ssl 不工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH的主要内容,如果未能解决你的问题,请参考以下文章

Nginx websockets + SSL 不工作(net::ERR_CERT_COMMON_NAME_INVALID)

ERR_SSL_PROTOCOL_ERROR

tomcat无法建立ssl连接

WebRTC websocket SSL 证书用于工作但不再可用? ERR_INSECURE_RESPONSE

从 Tomcat 到 SQL Server 2014 的 Java 7 SSL 连接

Tomcat 7 SSL 失败