在检索证书之前,InstallCert.java会崩溃服务器

时间:2014-11-12 21:45:58

标签: ssl ssl-certificate dropwizard

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

我有一张由CA签署的证书(特别是Comodo,通过Namecheap)。我安装了根证书和中间证书,然后安装了我自己的证书(使用Comodo's support上的说明。但是,当我第一次尝试连接到我的服务器时(它启动正常),我收到一个错误:{ {1}}(当然堆栈跟踪要长得多,但这是根本原因。)

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

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

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

同时,如果我用我的网站打开窗口,它会再次传递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 错误并崩溃(从而导致超时)。从本质上讲,在我看来,由于SSL问题,InstallCerts(应该修复我的SSL问题)会导致我的服务器崩溃。

如果我尝试使用像unable to find valid certification path to requested target这样的东西(这是我在某个地方看到的建议,将结果保存到.pem文件并安装),同样的事情也会发生。

这个问题有解决方案吗?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:5)

您可能错过了从Comodo根CA到您网站的证书的整个证书链。检查您在Dropwizard中配置的密钥库,看看是否全部拥有它们。最简单的方法是查找证书的颁发者,您需要拥有相同主题的证书,然后查找该证书的颁发者等等。确保尝试使用发行方的密钥指纹(密钥标识符)和发行方的发行方链接您的证书的授权密钥标识符证书扩展。如果你提供

keytool -list -keystore <your keystore> -rfc

我或许可以帮助你更多...

稍后添加:

我设法完全重现了你的问题。 TL; DR;添加:

validateCerts: true
trustStorePath: lyonesgamer.com.keystore
enableCRLDP: true

我创建了一个包含链(单个条目,3个证书,ca,从属ca和最终实体证书)的密钥库,以及另一个仅包含两个ca证书作为可信条目的密钥库。然后我配置了keyStorePathkeyStorePasswordtrustStorePathvalidateCerts: true

这导致:     java.security.cert.CertificateException: Unable to validate certificate: unable to find valid certification path to requested target

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

certpath: SunCertPathBuilder.depthFirstSearchForward(): validation failed:
java.security.cert.CertPathValidatorException: Could not determine revocation status

然后我记得如果你没有为CertPath API启用CRL Distribution Point扩展使用,你需要自己指定CRL。幸运的是,Dropwizard可以选择启用CRLDP:enableCRLDP: true。启用它后,应用程序成功启动。

或者,您可以将CRL保留在文件中,并将crlPath指向它。

答案 1 :(得分:0)

在这段时间之后,我一直在追逐一个兔子洞。原来问题是我(相当天真地)在我自己的计算机上测试它。 Dropwizard的验证发现错误,因为证书仅对我的个人计算机不属于我的域有效。因此它崩溃了,因为它无法验证。

我通过在我的Dropwizard配置文件中关闭validateCerts来发现这一点(我以为我已经把它关闭了,但显然不是)。 Dropwizard启动很好,允许我连接。当我这样做的时候,Firefox给了我一个不可信的连接错误,点击详细信息给了我更多有用的信息:

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)

非常感谢Zoran试图提供帮助。我担心这很多都是徒劳的。