Ssl InstallCert.java在检索证书之前使服务器崩溃

Ssl InstallCert.java在检索证书之前使服务器崩溃,ssl,ssl-certificate,dropwizard,Ssl,Ssl Certificate,Dropwizard,我有一个服务器在Dropwizard上运行(即为其web服务器运行Jetty)。我正在尝试为它设置SSL 我有一个由CA(特别是Comodo,通过Namecheap)签署的证书。我安装了根证书和中间证书,然后安装了我自己的证书(使用上的说明)。尽管如此,当我第一次尝试连接到我的服务器时(启动正常),我得到一个错误:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效认证路径(当然堆栈跟踪要长得多,但这是根本原因

我有一个服务器在Dropwizard上运行(即为其web服务器运行Jetty)。我正在尝试为它设置SSL

我有一个由CA(特别是Comodo,通过Namecheap)签署的证书。我安装了根证书和中间证书,然后安装了我自己的证书(使用上的说明)。尽管如此,当我第一次尝试连接到我的服务器时(启动正常),我得到一个错误:
sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效认证路径
(当然堆栈跟踪要长得多,但这是根本原因。)

我曾经尝试搜索这个错误,人们总是说它只应该发生在自签名证书上,而我的不是。尽管如此,我还是尝试下载了InstallCert.java程序,该程序似乎源于Sun博客上的一篇文章(现已删除)。具体地说,我是从Sun获得学位的

在几次(失败)尝试通过命令行使其工作后(这是另一次讨论),我最终使其正常运行。现在,我从程序中获得的输出是:

Loading KeyStore C:\Program Files\Java\jdk1.8.0_05\jre\lib\security\cacerts...
Opening connection to localhost:8443...
Starting SSL handshake...
Exception in thread "main" java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
    at com.aw.ad.util.InstallCert.main(InstallCert.java:98)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Process finished with exit code 1
同时,如果我用我的网站打开窗口,它会再次传递
无法找到请求目标的有效认证路径的错误并崩溃(因此导致超时)。本质上,在我看来,InstallCerts(应该修复我的SSL问题)正在因SSL问题而崩溃我的服务器

如果我尝试使用类似于
openssl s_client-connectlocalhost:8443-showcerts
(这是我在某处看到的建议,将结果保存到.pem文件并安装),同样的情况也会发生


是否有解决此问题的方法?我是否遗漏了一些明显的内容?

您可能遗漏了从Comodo根CA到站点证书的整个证书链。请检查您在Dropwizard中配置的密钥库,看看是否都有。最简单的方法是查找证书的颁发者,您需要e具有相同主题的证书,然后查找该证书的颁发者,依此类推。请确保尝试将证书的颁发机构密钥标识符证书扩展与颁发者的密钥指纹(密钥标识符)和颁发者的颁发者链接。如果您提供

keytool -list -keystore <your keystore> -rfc
我创建了一个包含链(单个条目、3个证书、ca、从属ca和最终实体证书)的密钥库和另一个仅包含两个ca证书的密钥库作为受信任条目。然后我配置了
keystrepath
keystrepassword
trustStorePath
validateCerts:true

这导致:
java.security.cert.CertificateException:无法验证证书:无法找到请求目标的有效证书路径

添加
-Djava.security.debug=certpath
后,我注意到吊销检查失败,这实际上是证书链失败的根本原因:

certpath: SunCertPathBuilder.depthFirstSearchForward(): validation failed:
java.security.cert.CertPathValidatorException: Could not determine revocation status
然后我想起,如果您没有为CertPath API启用CRL分发点扩展使用,您需要自己指定CRL。幸运的是,Dropwizard有一个选项来启用CRLDP:
enableCRLDP:true
。启用后,应用程序成功启动


或者,您可以将CRL保存在一个文件中,并指向它。

您可能缺少从Comodo根CA到站点证书的整个证书链。请检查您在Dropwizard中配置的密钥库,看看它们是否都有。最简单的方法是查找证书的颁发者,您可以如果您希望证书具有相同的主题,请接下来查找该证书的颁发者,依此类推。请确保尝试将证书的颁发机构密钥标识符证书扩展与颁发者的密钥指纹(密钥标识符)以及颁发者的颁发者链接。如果您提供

keytool -list -keystore <your keystore> -rfc
我创建了一个包含链(单个条目、3个证书、ca、从属ca和最终实体证书)的密钥库和另一个仅包含两个ca证书的密钥库作为受信任条目。然后我配置了
keystrepath
keystrepassword
trustStorePath
validateCerts:true

这导致:
java.security.cert.CertificateException:无法验证证书:无法找到请求目标的有效证书路径

添加
-Djava.security.debug=certpath
后,我注意到吊销检查失败,这实际上是证书链失败的根本原因:

certpath: SunCertPathBuilder.depthFirstSearchForward(): validation failed:
java.security.cert.CertPathValidatorException: Could not determine revocation status
然后我想起,如果您没有为CertPath API启用CRL分发点扩展使用,您需要自己指定CRL。幸运的是,Dropwizard有一个选项来启用CRLDP:
enableCRLDP:true
。启用后,应用程序成功启动


或者,您可以将CRL保存在一个文件中,并指向它。

经过这么长时间,我一直在追逐一个兔子洞。结果发现问题是我(相当天真地)在我自己的计算机上进行测试。Dropwizard的验证发现错误,因为该证书仅对我的域有效,而我的个人计算机不是该域的成员。因此,该证书因无法验证而崩溃

我通过在Dropwizard配置文件中关闭validateCerts发现了这一点(我本以为已经关闭了,但显然没有)。Dropwizard启动良好,允许我连接。当我这样做时,Firefox给了我一个不受信任的连接错误,单击Details给了我更有用的信息:

localhost:8443 uses an invalid security certificate.
The certificate is only valid for the following names: lyonesgamer.com, www.lyonesgamer.com
(Error code: ssl_error_bad_cert_domain)

谢谢你,佐兰,非常感谢你的帮助。我担心很多都是徒劳的。

经过这么长时间,我一直在追逐一个兔子洞。问题是我(相当天真