在我们的应用程序中,我们需要根据存储在数据库中的 URL 和受信任的 SSL 证书调用多个 Web 服务器。这些证书是自签名的,但我们无法将它们添加到 WebLogic 信任库中。这是 2-way SSL 但我们的服务器拒绝远程证书。
这样做的正确方法是什么?
(问题的其余部分描述了我们已经尝试过的内容。)
在 WebLogic 10g 中,我们曾经执行以下操作:
WlsSSLAdapter adapter = new WlsSSLAdapter();
try {
// setup for client certificate
adapter.setKeystore(…);
adapter.setClientCert(…);
// setup for accepting the remote certificate
adapter.setTrustManager(new TrustManager() {
@Override
public boolean certificateCallback(X509Certificate[] paramArrayOfX509Certificate, int paramInt) {
return paramArrayOfX509Certificate[0] == expectedCertificate;
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
((weblogic.wsee.jaxrpc.StubImpl) servicePort)._setProperty(weblogic.wsee.jaxrpc.WLStub.SSL_ADAPTER, adapter);
然而,在 WebLogic 11g 中,即使TrustManager
调用了(我们使用调试器进行了检查),WebLogic 也会拒绝证书:
<validationCallback: validateErr = 16>
< cert[0] = Serial number: 9232073310112809071929676484517784211
Issuer:C=US, ST=MyState, L=MyTown, O=MyOrganization, OU=FOR TESTING ONLY, CN=mestoudi2
Subject:C=US, ST=MyState, L=MyTown, O=MyOrganization, OU=FOR TESTING ONLY, CN=mestoudi2
Not Valid Before:Tue Nov 01 14:33:31 CET 2011
Not Valid After:Sun Nov 02 14:33:31 CET 2031
Signature Algorithm:MD5withRSA
>
<weblogic user specified trustmanager validation status 16>
<Certificate chain received from mestoudi2 - 10.142.0.23 was not trusted causing SSL handshake failure.>
<Validation error = 16>
<Certificate chain is untrusted>
<SSLTrustValidator returns: 16>
<Trust status (16): CERT_CHAIN_UNTRUSTED>
<NEW ALERT with Severity: FATAL, Type: 42
java.lang.Exception: New alert stack
at com.certicom.tls.record.alert.Alert.<init>(Unknown Source)
at com.certicom.tls.record.handshake.HandshakeHandler.fireAlert(Unknown Source)
at com.certicom.tls.record.handshake.ClientStateReceivedServerHello.handle(Unknown Source)
…
我认为第一个区别发生在weblogic 用户指定的信任管理器验证状态 16行上,其中在 WebLogic 10g 中该值是 0 而不是 16。
如果我们在 WebLogic 管理控制台中选中“使用 JSSE SSL”(将实现切换到com.sun.net.ssl
而不是com.certicom.tls
),则TrustManager
根本不会调用 。
我们还尝试TrustManager
通过实现javax.net.ssl.X509TrustManager
我们在weblogic.wsee.connection.transport.https.HttpsTransportInfo
传递给存根的 a 上设置的 a 来配置
((weblogic.wsee.jaxrpc.StubImpl) servicePort)._setProperty(TRANSPORT_INFO, transportInfo);
但它也没有被调用——但它适用于例如设置代理。我们正在使用 clientgen Ant 任务 ( weblogic.wsee.tools.anttasks.ClientGenTask
) 生成存根。