繁体   English   中英

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

[英]Java HTTPS connection with SSL certificate Error

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

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

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

问题是您的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. JRE没有将根CA作为其密钥库中的受信任条目。
  2. 服务器没有发送正确的链。

但是,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版本的信任库中受信任。

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

SO上已经存在类似的一些问题(如下所示: PKIX路径构建失败:无法找到所请求目标的有效证书路径 )。

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

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

编辑:

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

我建议使用建立在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());
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM