【问题标题】:GET from Glassfish with specifying .pem file通过指定 .pem 文件从 Glassfish 获取
【发布时间】:2017-02-21 17:02:43
【问题描述】:

通过指定 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 文件吗?这样会有什么好处吗?

【问题讨论】:

    标签: java ssl jersey certificate keystore


    【解决方案1】:

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

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

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

    【讨论】:

    • 加载 trustStore 而不是 keystore 时,我得到 org.apache.hadoop.gateway.shell.HadoopException: Unable to load truststore。可能与密码设置或信任库格式有关。我可以使用 keytool -list -v -keystore store.jks 访问证书的内容(这意味着我有正确的密码)。
    • 似乎Hadoop 也在使用javax.net.ssl.trustStore。根本原因是 IOException(查看代码)。可能是文件权限或指向错误文件? (你说密码正确)。
    • 通过绝对正确,我可以使用 keytool -list -v -keystore store.jks 来检查 jks 的内容。是的,Hadoop 也在使用信任库。设置密钥库属性给了我这个,而设置信任库让我无法找到有效的证书路径。 JKS 文件包含在已部署的战争中,并且已经使用 jks 文件对 Hive jdbc 连接进行身份验证,并且工作正常。完全被这个难住了……
    • 请注意,如果您设置了全局信任库,那么JAVA_HOME/lib/security/cacerts 的默认信任库将不会被使用,它可能会影响其他应用程序,例如 Hadoop。将所需的受信任证书添加到您的信任库。查看源代码,似乎您的 Hadoop 使用的是 JVM 默认值,而不是类路径中的信任库(如果设置了 truststoreDirtrustStoreFilename,则不使用默认设置)。请参阅我的回答 javax.net.ssl.trustStore 不能使用类路径中的文件。你需要设置一个绝对位置
    • 在尝试使用 sudo keytool -import -keystore cacerts -file /home/xxx/store.jks 导入 IOE 时遇到相同的“已被篡改”问题。还尝试了硬编码的绝对路径(尽管我在第一个实例中也生成了绝对路径),同样的问题。
    猜你喜欢
    • 2022-01-03
    • 2021-05-05
    • 2015-05-24
    • 2021-12-30
    • 2015-11-02
    • 2021-03-12
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多