带有SSL证书的Java HTTPS连接错误

时间:2015-05-12 19:27:29

标签: java ssl

我试图在Apache服务器上使用通过StartSSL.com获得的SSL证书。与浏览器的连接很好,但是当我尝试使用Java应用程序时,我得到了这个例子:

  

线程中的异常" main" javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径

我不明白可能是什么问题,因为使用浏览器,我获得了带有绿色标签的SSL。

5 个答案:

答案 0 :(得分:6)

问题是您的Java不信任证书。您必须将其导入java的truststore

# Copy the certificate into the directory Java_home\Jre\Lib\Security
# Change your directory to Java_home\Jre\Lib\Security>
# Import the certificate to a trust store.
# Here's the import command:

keytool -import -alias ca -file somecert.cer -keystore cacerts -storepass changeit [Return]

Trust this certificate: [Yes]

changeit 是默认的信任库密码。

对于您导入信任库的每个证书,您必须提供一个新别名。

导入方法是Here

的引用

答案 1 :(得分:1)

此消息归因于:

  1. JRE没有将根CA作为其密钥库中的受信任条目。
  2. 服务器未发送正确的链。
  3. 但是,2在您的情况下无效,因为浏览器能够构建链并验证证书。

    因此,您需要获取根CA并将其作为受信任条目放在JRE密钥库中。有很多资源记录了“如何”。其中之一是: https://access.redhat.com/documentation/en-US/Fuse_Message_Broker/5.3/html/Security_Guide/files/i379776.html

    编辑1:由于您想要共享Java应用程序,我们是否值得努力从CA获取证书,该证书的根目录已经在您的应用程序支持的Java版本的信任库中受到信任。

答案 2 :(得分:0)

据我所知,这与Java证书密钥库有关。您的证书不被java接受。以下是如何将证书添加到Java可信证书密钥库的链接: https://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html

答案 3 :(得分:0)

在SO上已经存在类似的一些问题(例如:PKIX path building failed: unable to find valid certification path to requested target)。

通常的答案是您的Java客户端没有完成证书链所需的证书。

如果您需要正确的证书验证,那么您必须弄清楚证书链发生故障的位置。如果不这样做(因为这是概念证明或开发沙箱,或其他),那么您可以通过将证书添加到您与客户端一起使用的信任库来轻松解决此问题。

编辑:

至于为什么您的浏览器会接受这一点,很可能您的浏览器都拥有您需要的链中的证书,或者您心不在焉地告诉您的浏览器信任该证书,即使它也无法验证证书

答案 4 :(得分:0)

我建议使用基于apache http api构建的http-request

import org.junit.Test;

import static org.apache.http.HttpHeaders.ACCEPT;
import static org.apache.http.HttpStatus.SC_OK;
import static org.apache.http.entity.ContentType.APPLICATION_XML;
import static org.junit.Assert.assertEquals;

public class HttpRequestSSLTest {

private final HttpRequest<?> httpRequest = HttpRequestBuilder.createGet("https://mms.nw.ru/")
        .trustAllCertificates()
        .trustAllHosts()
        .addDefaultHeader(ACCEPT, APPLICATION_XML.getMimeType())
        .build();

@Test
public final void ignoreSSLAndHostsTest() throws Exception {

    assertEquals(SC_OK, httpRequest.execute().getStatusCode());
}

}