java - 使用指定的 .pem 文件从 Glassfish 获取

标签 java ssl jersey certificate keystore

通过指定 cert.pem 文件,我可以从我的 Glassfish 机器上通过 curl 命令访问我想要的 URL。

然而,在我的 Java 应用程序中,我尝试使用一个 jks 文件,该文件包含与我得到异常完全相同的信息。

我在 Java 中这样做:

    System.setProperty("javax.net.ssl.keyStore", keystore_path);
    System.setProperty("javax.net.ssl.keyStorePassword", "pass123");

Keystore 路径由

检索
getClass().getClassLoader().getResource("/keystore.jks").getPath()

虽然我可以使用 keytool 实用程序查看 jks 文件内部,但我从 Glassfish 获得以下堆栈跟踪:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java: 141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java: 126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java: 280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java: 382) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java: 292) at sun.security.validator.Validator.validate(Validator.java: 260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java: 324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java: 229) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java: 124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java: 1491) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java: 216) at sun.security.ssl.Handshaker.processLoop(Handshaker.java: 979) at sun.security.ssl.Handshaker.process_record(Handshaker.java: 914) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java: 1062) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java: 1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1387) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java: 543) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java: 409) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java: 177)

其中一个建议是指定进行单向握手,但我不确定如何指定。

此外,我是否可以像在使用 curl 命令时那样指定 .pem 文件,这样会有任何好处吗?

最佳答案

您需要设置 trustStore 变量,而不是 keyStore

System.setProperty("javax.net.ssl.trustStore", keystore_path);
System.setProperty("javax.net.ssl.trustStorePassword", "pass123");

还要确保 keystore_path 指向绝对位置。它无法从类路径加载文件

关于java - 使用指定的 .pem 文件从 Glassfish 获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373571/

相关文章:

java - 我需要为 JDK 1.9 下载哪个 Jersey 版本?

java - 处理 wsdl 文件时出现问题 :WSDLException. 尝试解析架构时出错

java - 如何在Kotlin中使用注释TypeDefs?

php - 使用 IE7 IE8 通过 SSL 从 PHP Web 应用程序间歇性下载错误

AngularJS + Jersey RESTful 后端 : Authentication & Authorization

java - Jersey :禁止未指定的参数

java - 在 EJB-Hibernate 环境中使用 JDBC

java - 我该如何优化这个 "sort"?

c# - SSL 握手期间未提供客户端证书

c# - FTPS (SSL) 的证书验证/安装?