【问题标题】:Documentum Rest Service - Trusting SSL certificate from Java ClientDocumentum Rest 服务 - 信任来自 Java 客户端的 SSL 证书
【发布时间】:2016-10-24 18:43:38
【问题描述】:

我的需要是接受来自独立 Java 应用程序(将捆绑为 JAR)在 REST Web 服务 URL (https://:/dctm-rest) 上启用的 SSL 证书。

据我所知,最好的方法是使用 Keytool 创建 KeyStore/TrustStore,从浏览器/openssl 下载证书并将其添加到 TrustStore。这样,我们正在创建一个依赖项,并且必须有人在每次续订时不断更新证书。

有人可以指导我通过删除手动依赖来实现这个吗?

【问题讨论】:

  • 1.调试后发现Documentum连接使用“https”url成功,并且没有添加任何信任库。 2. 使用“resttemplate.exchange() 向 Webservice 发送请求时引发异常。3.我尝试使用“system.setproperty”正确添加 TrustStore 的位置,但我可以看到以下错误原因:com.fasterxml.jackson。 core.JsonParseException: Unexpected character ('
  • 1) 如果服务器的证书位于 JRE cacerts 中,则不需要设置信任关系 2) 我认为您的服务器返回 xml 或 html 响应,而不是 json。确保您已在 Accept 标头中设置 application/json 内容类型并记录查看内容的响应

标签: rest ssl ssl-certificate sslhandshakeexception


【解决方案1】:

您必须将https://dctm-rest 的服务器证书包含在您的 JRE(信任库)的白名单中

选项

1) 在 JRE trustore 中包含服务器证书 (jre/lib/security/cacerts)(不推荐

要下载服务器证书,用浏览器打开站点,右键单击绿色锁,选择“查看证书”并下载

探索 cacerts 和导入可信证书的最简单方法是使用像 portecle (http://portecle.sourceforge.net/) 这样的 GUI 工具。你也可以使用keytool

keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts -alias mycert -noprompt -storepass changeit -file /tmp/examplecert.crt

How to properly import a selfsigned certificate into Java keystore that is available to all Java applications by default?

2) 使用您自己的信任库并包含服务器证书(推荐

System.setProperty ("javax.net.ssl.trustStore", path_to_your_trustore_jks_file);
System.setProperty ("javax.net.ssl.trustStorePassword", "password");

您还可以创建 SSLSocketFactory 并在连接之前添加到您的连接或使用静态方法应用于所有连接

HttpsURLConnection.setDefaultSSLSocketFactory(sslFactory);

这是一个创建套接字工厂的例子

//Load JKS keystore that includes the server certificate or the root
KeyStore keyStore = ... 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
sslFactory = ctx.getSocketFactory();

3) 根本不使用信任库(完全不推荐)

Disable SSLHandshakeException for a single connection(我不会复制解决方案)

【讨论】:

  • 感谢 pedrofb 提供详细的选项,即使我倾向于选项 1/2。如果我正确的话,有人必须继续更新 TrustStore 以进行每次证书续订,否则他们最终会出现 SSL 握手异常,这反过来又是手动的活动。我的组件是一个 Jar 文件,它将被 diff env 上托管​​的其他 Web 应用程序使用,并且不希望根据证书到期日期使其复杂/手动依赖。
  • 真的你只需要分发根证书。通常它们的发行期限很长
  • 再次感谢,同意你消费根链。只是想知道我们能否以编程方式从 https 站点提取证书并将其添加到我的密钥库中?这样我们可以避免手动依赖?
  • 有可能。甚至只需下载密钥库更新。但是更新外部系统中的文件可能会让人头疼。考虑使用当前在 JDK cacerts 中的可信 CA
  • 嗨@Santhost 如果这个或任何答案已经解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
猜你喜欢
  • 2014-06-07
  • 2011-06-11
  • 2014-02-23
  • 1970-01-01
  • 2012-04-18
  • 2010-09-13
  • 2012-02-15
  • 2015-10-20
  • 2014-02-14
相关资源
最近更新 更多