Weblogic REST客户端使用Jersey HTTPS:握手失败

4

安装:WL 9.2 + Jersey 1.1.5.1 在WL的Jrockit上运行。 选择Jersey 1.1.5.1是因为较新版本需要Java 6。 Weblogic EJB作为REST客户端并不断收到以下错误:

ClientHandlerException: javax.net.ssl.SSLKeyException: [Security:090477]从svcpoint.restprovider.com - xx.xxx.xxx.xx接收的证书链未被信任,导致SSL握手失败。

由于这只是一个POC实现,Weblogic设置了各种标志来忽略证书验证,以使此错误消失:

-Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.enforceConstraints=off  -Dweblogic.webservice.client.ssl.strictcertchecking=false

此外,Jersey配置设置包括以下部分:
SSLContext ctx = SSLContext.getInstance("SSL");
HTTPSProperties prop = new HTTPSProperties(
new HostnameVerifier () {
    public boolean verify(String hostname, SSLSession session) {
        System.out.println("\n\nFAKE_Verifier: " + hostname+"\n\n");
        return true;
    }
}, ctx);
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, prop);

最后,唯一的WL服务器,即技术上的管理员srv,在管理控制台SSL高级设置中被配置为不使用主机名验证。

现在,我非常确定我的Jersey伪造验证器设置实际上没有参与其中,因为我从SSL调试中看到了这个错误:

<SecuritySSL> <000000> <weblogic user specified trustmanager validation status 16> 
<Security> <BEA-090477> <Certificate chain received from svcpoint.restprovider.com - xx.xxx.xxx.xx was not trusted causing SSL handshake failure.> 
<SecuritySSL> <000000> <Validation error = 16> 
<SecuritySSL> <000000> <Certificate chain is untrusted> 
<SecuritySSL> <000000> <SSLTrustValidator returns: 16> 
<SecuritySSL> <000000> <Trust status (16):  CERT_CHAIN_UNTRUSTED> 
<SecuritySSL> <000000> <NEW ALERT with Severity: FATAL, Type: 42
  java.lang.Exception: New alert stack
at com.certicom.tls.record.alert.Alert.<init>(Unknown Source)

我已经在谷歌上搜索并查看了其他类似的问题,但我可能还是漏掉了一些东西。此外,从我的判断来看,证书似乎是有效的,显示它是为CN=*.restprovider.com颁发的,到2011年11月到期。

1个回答

2
证书不受信任。我认为最好的解决方案是使用keytool将其添加到Weblogic的信任存储中:
keytool -importcert -trustcacerts ...

你也可以通过代码来实现:

你也可以通过代码来实现:

   TrustManagerFactory trustManagerFactory = TrustManagerFactory
                .getInstance("SunX509");
   trustManagerFactory.init(trustStore);
   trustManagers = trustManagerFactory.getTrustManagers();
   SSLContext context = SSLContext.getInstance("TLS");
   context.init(keyManagers, trustManagers, new SecureRandom());
   HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

trustStore是一个包含证书的密钥库


是的,我已经尝试添加它了,但似乎没有什么帮助。我想知道是否有关于Jersey需要注意的事项,以使其正常工作。 - Karoy
1
好的,将证书添加到 \jrockit90_150_10\jre\lib\security\cacerts 密钥库中是正确答案。由于某种错误的原因,我只将其添加到了特定服务器实例的 DemoIdentity.jks 存储中。 - Karoy
不确定这是怎么发生的,但是适用于此处的正确密钥库是 server\lib\DemoTrust.jks。我的先前评论表示了相反的情况,但显然是错误的。我的错。。 - Karoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接