【问题标题】:Using https in Rest web service在 Rest Web 服务中使用 https
【发布时间】:2019-10-25 20:55:21
【问题描述】:

我有一个用 java 开发的 Rest web 服务 glassfish,在 centos 服务器上运行。

我们最近选择使用 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中的错误是下面帖子中出现的错误,已经阅读了各种原因但无法解决。

Error - trustAnchors parameter must be non-empty

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

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

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

【问题讨论】:

    标签: java https centos


    【解决方案1】:

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

    $JAVA_HOME/jre/lib/security/cacerts
    

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

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

    【讨论】:

    • 我不明白...变量 $JAVA_Home 不等于“/etc/alternatives/jre_1.8.0/lib/security/cacerts”?
    • 你需要明确设置
    • 你的意思是:我设置了$JAVA_HOME = '/etc/alternatives/'?它会对最终结果产生影响吗?
    • 你的 JAVA_HOME 是什么?它应该类似于 /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home (在 Mac 中)。您使用的是哪个操作系统?你用的是哪个java版本?如果您不想使用代码显式指定证书位置,最终目标是找到路径($JAVA_HOME/jre/lib/security/cacerts)并将证书导入信任库。
    • 是centos 8
    【解决方案2】:

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

    你也可以在运行时使用

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

    【讨论】:

    • $java_home\jre\lib\security\cacerts\ 来自服务器,对吗?证书已经在目录中。 “-Djavax.net.ssl.trustStore=/home/user/SSL/mycacerts -Djavax.net.ssl.keyStore=/home/user/SSL/serverkeystore.jks”我把这个放在哪里?无论如何,我仍然需要知道证书路径。如果是第三方服务器呢?我怎么知道路?
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2021-05-31
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多