【问题标题】:Apache Tomcat for Windows SSL Implementation not working用于 Windows SSL 实现的 Apache Tomcat 不起作用
【发布时间】:2015-05-11 01:09:12
【问题描述】:
  • 环境:Windows 2003 Server - 64 位
  • 服务器名称:devtest.domain.local
  • Apache Tomcat 6.0.36 服务器 - http://tomcat.apache.org/ (Windows)
  • Sun Java JDK:jdk1.6.0_26

同时定义:%CATALINA_HOME% 和 %JAVA_HOME%。

CATALINA_HOME=d:\tomcat
JAVA_HOME=D:\Program Files\Java\jdk1.6.0_26

为我们的证书颁发机构生成 CSR..

"%JAVA_HOME%\bin\keytool.exe" -genkey -alias "test.domain.local" -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -keystore "C:\NewCert\keystore.ks" -dname "CN=test.domain.local, OU=IT, O=Company Name, L=AnyTown, ST=State, C=US" -storepass "APASSWORD" && "%JAVA_HOME%\bin\keytool.exe" -certreq -keyalg RSA -sigalg SHA256withRSA -alias "test.domain.local" -file "C:\NewCert\test.csr" -keystore "C:\NewCert\keystore.ks" -storepass "APASSWORD"

是的,我知道服务器名称:devtest.domain.local 与 test.domain.local 的 CSR 不同。我也修改了 windows 主机文件,但仍然无法正常工作。

然后,我将 test.csr 发送给我们的证书管理员并收到一个名为:test.cer 的文件

让我们导入证书:

"%JAVA_HOME%\bin\keytool.exe" -importcert -file "C:\NewCert\test.cer" -keystore "C:\NewCert\keystore.ks" -alias "tomcat" -storepass "APASSWORD"

编辑文件 D:\tomcat\conf\server.xml 我们有:

    <!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               SSLEnabled="true"
maxThreads="200" scheme="https" secure="true"
keystoreFile="C:\NewCert\keystore.ks" keystorePass="APASSWORD"
clientAuth="false" keyAlias="tomcat" sslProtocol="TLS" />

然后重新启动 Apache Tomcat for Windows..

网站运行良好..http://localhost/manager/html

我们去看看8443端口:https://localhost:8443/manager/html 我们无法提取基于 SSL 的网页。我也试过端口 443 也没有成功。自签名证书不是一种选择 - 我们停止了对这些的审计。

发现错误,见下文..

-Djavax.net.debug=ssl,handshake

其实我已经添加了我们自定义的服务器选项:

-Xms1g
-Xmx6g
-XX:PermSize=256m
-XX:NewSize=256m
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m
-XX:+AggressiveHeap
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-verbose:gc
-Dcom.sun.management.jmxremote.port.8086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dhttps.proxyHost=10.10.10.10
-Dhttps.proxyPort=8080
-Djavax.net.debug=ssl,handshake

做了更多的挖掘,在我们的标准输出日志中发现了以下内容..

*** ClientHello, TLSv1
RandomCookie:  GMT: 1409089044 bytes = { <REMOVED_COOKIE> }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA]
Compression Methods:  { 0 }
Extension renegotiation_info, renegotiated_connection: <empty>
***
http-8443-exec-1, fatal error: 40: no cipher suites in common
javax.net.ssl.SSLHandshakeException: no cipher suites in common
http-8443-exec-1, SEND TLSv1 ALERT:  fatal, description = handshake_failure
http-8443-exec-1, WRITE: TLSv1 Alert, length = 2
http-8443-exec-1, fatal: engine already closed.  Rethrowing javax.net.ssl.SSLHandshakeException: no cipher suites in common
http-8443-exec-1, called closeOutbound()
http-8443-exec-1, closeOutboundInternal()
Using SSLEngineImpl.
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
http-8443-exec-2, READ: SSLv3 Handshake, length = 67

找到这篇文章 - 似乎正是我需要的 - Tomcat 7 getting SSLv2Hello is disabled error when trying to make client server ssl authntication

谢谢!

【问题讨论】:

    标签: java apache tomcat ssl keytool


    【解决方案1】:
    1. 尝试对密钥、certreq 和 cert 使用相同的别名(例如 test.domain.local)。然后在server.xml中配置keyAlias="test.domain.local"
    2. 使用keytool生成私钥时是否指定了密钥密码?尝试在 server.xml 中为 https 连接器指定 keyPass=&lt;password&gt;

    logs 目录中的任何日志文件中真的没有错误/警告/致命消息吗?应该有一个。

    【讨论】:

    • 我当然可以将服务器名称用于测试/开发环境:testdev.domain.local 用于 CSR 和 CER,但我还有另一组服务器 - 我需要三个处于负载平衡配置的服务器别名。我将从测试/开发服务器开始,我会告诉你。我还删除了 parent.cer,因为我们在密钥库中也设置了供应商的证书。
    • 刚看到这个帖子.. -stackoverflow.com/questions/26488667/…
    • 那么正确的解决方案与证书有关吗?缺少兼容的密码套件失败?也许我很困惑?
    【解决方案2】:

    Juraj - 我给了你荣誉,因为我还没有完成我的研究。无论如何,我暂时关闭:

    -Dhttps.proxyHost=10.10.10.10
    -Dhttps.proxyPort=8080
    

    因为我认为这可能会混淆本地证书。我必须重新打开它,因为我们有供应商连接并且必须从他们那里收集数据。

    在帖子中,Tomcat 7 getting SSLv2Hello is disabled error when trying to make client server ssl authntication

    我正在测试响应者的建议:

     sslProtocol="TLS"
     sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2,SSLv2Hello"
    

    由于我是本周待命的人,所以我会花一些时间来解决这个问题,并在我得到解决方案时通知大家。 谢谢。

    【讨论】:

      【解决方案3】:

      问题在于 SSL 存在大量漏洞。不支持 SSL 的服务器不应接受 SSL 格式的 hello,并且任何服务器都不应接受非 TLS 连接作为安全连接。一些供应商在保护漏洞方面的速度比其他供应商慢,但问题是您是否想牺牲自己的安全性来适应这样做的其他供应商。

      最近发现 RC4 的安全性比以前想象的要低,您的客户提供了一堆导出套件。这一切都让我觉得是一场等待发生的灾难。牢牢掌握您在服务器上允许使用的密码套件以及您希望使用的密码套件。这就是风险分析的用武之地。考虑一下您将接受哪些牺牲来适应客户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 2019-01-07
        • 2017-12-21
        相关资源
        最近更新 更多