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" />
我们设置了从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,并安装了一份新的证书副本,并得到了同样的错误。
答案 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”实现,那么您的配置必须完全不同。)
奇怪的网址。端口号应遵循服务器名称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)
我遇到了同样的问题,我解决了。
请向您的密钥库添加密码-可以!