繁体   English   中英

在 Rest web 服务中使用 https

[英]Using https in Rest web service

我有一个 Rest web 服务在 java 中开发,glassfish,在 ZCDC872DB616AC618ADB3316 服务器上运行。

我们最近选择使用 https 协议,并在部署时通过 glassfish 本身提供的测试证书(端口 8181)开始测试。

使用 Postman 进行测试我只需要禁用配置中的一个选项:“SSL 证书验证”。

但是,在 java 中使用我的服务 service destop 的模块开始抛出异常。

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

在测试环境中,windows,下面几行纠正了问题,已经在生产中,数百,无法解决。

String certificatesTrustStorePath = "/etc/alternatives/jre_1.8.0/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

centos中的错误是下面帖子中出现的错误,已经阅读了各种原因但无法解决。

错误 - trustAnchors 参数必须为非空

如果你知道如何在 linux 中解决我很感激,但问题不是这个......

我发布的这些行是否指定了 cacerts 文件的位置(以及在我的平台证书中)? 但在我看来这是错误的......我已经使用了第三方 https rest 服务,并且从未指定证书路径......这需要我在结构上了解第三方服务器的一些细节。 我错了吗?

所以,我想必须有另一种方法来做到这一点......有人可以帮忙吗?

是的,您的代码为存在 ssl 证书的信任库指定了自定义路径。 这是与用于握手的 https 协议相对应的共享公钥(自签名或由列入白名单的 CA 签名)。 这些存储的默认路径是

$JAVA_HOME/jre/lib/security/cacerts

虽然上面可以被覆盖。 因此,在您的代码中,您已经覆盖了路径,将其指向公钥(证书)已经存在的位置。 因此它对你有用。 Truststore 只是公钥的集合。

或者,您也可以在默认信任库中导入公钥以使其正常工作。 在这种情况下,您不必显式设置不同的信任库。

有很多方法可以做到这一点。 将您的文件复制到$java_home\jre\lib\security\cacerts\ ,而不必手动设置属性。

您还可以在运行时使用

-Djavax.net.ssl.trustStore=/home/user/SSL/mycacerts -Djavax.net.ssl.keyStore=/home/user/SSL/serverkeystore.jks

暂无
暂无

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

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