【问题标题】:"SunX509 TrustManagerFactory not available" on AIX (SSL webservice client)AIX(SSL Web 服务客户端)上的“SunX509 TrustManagerFactory 不可用”
【发布时间】:2012-04-13 03:46:28
【问题描述】:

我在 JBoss 4.2.2 容器中的 Java 组件尝试访问 SSL Web 服务,但它得到了一个异常(不重要,功能正常,从 ssl Web 服务检索响应)。

操作系统:AIX

Java:

> /usr/java6_64/bin/java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap6460sr9fp1-20110208_03(SR9 FP1))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460sr9-20110203_74623 (JIT enabled, AOT enabled)
J9VM - 20110203_074623
JIT  - r9_20101028_17488ifx3
GC   - 20101027_AA)
JCL  - 20110203_01

代码:

SOAPMessage reply = connection.call(message, webserviceUrl);

connection 是一个 SOAPConnection。

我得到以下日志输出:

2012-03-29 15:10:17,651 ERROR [org.jboss.remoting.transport.http.HTTPClientInvoker] (Thread-17) Error creating SSL Socket Factory for client invoker.
java.io.IOException: Error initializing socket factory SSL context: SunX509 TrustManagerFactory not available
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:230)
        at javax.net.ssl.TrustManagerFactory.getInstance(TrustManagerFactory.java:11)
        at org.jboss.remoting.security.SSLSocketBuilder.loadTrustManagers(SSLSocketBuilder.java:1407)
        at org.jboss.remoting.security.SSLSocketBuilder.initializeSocketFactorySSLContext(SSLSocketBuilder.java:1326)
        at org.jboss.remoting.security.SSLSocketBuilder.createCustomSocketFactory(SSLSocketBuilder.java:451)
        at org.jboss.remoting.security.SSLSocketBuilder.createSSLSocketFactory(SSLSocketBuilder.java:431)
        at org.jboss.remoting.security.SSLSocketBuilder.createSSLSocketFactory(SSLSocketBuilder.java:381)
        at org.jboss.remoting.transport.http.ssl.HTTPSClientInvoker.createSocketFactory(HTTPSClientInvoker.java:140)
        at org.jboss.remoting.RemoteClientInvoker.<init>(RemoteClientInvoker.java:46)
        at org.jboss.remoting.transport.http.HTTPClientInvoker.<init>(HTTPClientInvoker.java:105)
        at org.jboss.remoting.transport.https.TransportClientFactory.createClientInvoker(TransportClientFactory.java:39)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:611)
        at org.jboss.remoting.InvokerRegistry.loadClientInvoker(InvokerRegistry.java:419)
        at org.jboss.remoting.InvokerRegistry.createClientInvoker(InvokerRegistry.java:320)
        at org.jboss.remoting.Client.connect(Client.java:459)
        at org.jboss.ws.core.client.RemotingConnectionImpl.createRemotingClient(RemotingConnectionImpl.java:247)
        at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:165)
        at org.jboss.ws.core.client.SOAPRemotingConnection.invoke(SOAPRemotingConnection.java:77)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:106)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:66)
        at xxx.yyy.fooservice.FooServiceImpl.foo(FooServiceImpl.java:103)
        at xxx.yyy.fooservice.FooAsyncRunner.run(FooAsyncRunner.java:31)
        at java.lang.Thread.run(Thread.java:736)

我尝试使用网上的提示修改$JAVA_HOME/jre/lib/security/java.security中的ssl.KeyManagerFactory.algorithm和ssl.TrustManagerFactory.algorithm,但还是报错。

额外信息:指定后出现上述异常

export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=$JAVA_HOME/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=foo"

... 在 JBoss 4.2.2 启动中,在此之前我遇到了以下异常:

2012-03-28 12:10:13,424 ERROR [org.jboss.remoting.transport.http.HTTPClientInvoker] (Thread-13) Error creating SSL Socket Factory for client invoker.
java.io.IOException: Error initializing socket factory SSL context: Can not find truststore url.
        at org.jboss.remoting.security.SSLSocketBuilder.initializeSocketFactorySSLContext(SSLSocketBuilder.java:1340)
        at org.jboss.remoting.security.SSLSocketBuilder.createCustomSocketFactory(SSLSocketBuilder.java:451)
        at org.jboss.remoting.security.SSLSocketBuilder.createSSLSocketFactory(SSLSocketBuilder.java:431)
        at org.jboss.remoting.security.SSLSocketBuilder.createSSLSocketFactory(SSLSocketBuilder.java:381)
        at org.jboss.remoting.transport.http.ssl.HTTPSClientInvoker.createSocketFactory(HTTPSClientInvoker.java:140)
        at org.jboss.remoting.RemoteClientInvoker.<init>(RemoteClientInvoker.java:46)
        at org.jboss.remoting.transport.http.HTTPClientInvoker.<init>(HTTPClientInvoker.java:105)
        at org.jboss.remoting.transport.https.TransportClientFactory.createClientInvoker(TransportClientFactory.java:39)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:611)
        at org.jboss.remoting.InvokerRegistry.loadClientInvoker(InvokerRegistry.java:419)
        at org.jboss.remoting.InvokerRegistry.createClientInvoker(InvokerRegistry.java:320)
        at org.jboss.remoting.Client.connect(Client.java:459)
        at org.jboss.ws.core.client.RemotingConnectionImpl.createRemotingClient(RemotingConnectionImpl.java:247)
        at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:165)
        at org.jboss.ws.core.client.SOAPRemotingConnection.invoke(SOAPRemotingConnection.java:77)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:106)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:66)
        at xxx.yyy.fooservice.FooServiceImpl.foo(FooServiceImpl.java:103)
        at xxx.yyy.fooservice.FooAsyncRunner.run(FooAsyncRunner.java:31)
        at java.lang.Thread.run(Thread.java:736)

我可以做些什么来使这些异常消失?非常感谢所有帮助!提前谢谢你。

【问题讨论】:

    标签: java web-services ssl aix x509


    【解决方案1】:

    在快速查看 JBoss 的 SSLSocketBuilder.loadTrustManagers 后,它尝试使用配置中的 org.jboss.remoting.trustStoreAlgorithm 属性,回退到 org.jboss.remoting.keyStoreAlgorithm,然后回退到硬编码的默认值 SunX509

    请注意,即使在 Sun/Oracle JRE 上,这也不是信任管理器算法的默认值 it's PKIX

    我会将此作为错误/RFE 报告给 JBoss:当没有设置任何内容时,它可能应该回退到 TrustManagerFactory.getDefaultAlgorithm()(这就是此方法的重点)。

    您可能必须在配置中明确设置这些属性之一才能使用 IBM 的默认信任管理器算法,以防止它回退到这些硬编码的默认值。

    【讨论】:

    • 我尝试在 jboss 中设置 export JAVA_OPTS="$JAVA_OPTS -Dorg.jboss.remoting.trustStoreAlgorithm=IbmX509" export JAVA_OPTS="$JAVA_OPTS -Dorg.jboss.remoting.keyStoreAlgorithm=IbmX509" ... startup.sh,但问题仍然存在 - 如果没有,应该在哪里指定这个配置?
    • 我怀疑这是系统属性(您尝试过的方式)。也许在something-service.xml。查看文档:docs.jboss.org/jbossremoting/docs/guide/2.5/html/…
    • 上述评论中的 url 错误 (docs.jboss.org/jbossremoting/docs/guide/2.5/html/…),但正如我在 pastebin.com/RW21nExF 中指定的其他评论一样,我什至尝试在 jboss-service.xml 中指定它...感谢您的帮助,但是。
    【解决方案2】:

    对于 IBM JVM,名称是 IbmX509 而不是 SunX509,这是 JBoss 使用的默认值,除非另有明确配置。

    详情请参阅http://docs.jboss.org/jbossweb/2.1.x/ssl-howto.html。搜索 IbmX509。

    【讨论】:

    • 是的,我怀疑里面的“Sun”表明出了什么问题。但是我的 Web 服务代码根本没有指定任何关于 HTTPS/SSL 的内容,所以我很好奇如何让系统在 AIX 上运行以用于更正类。我已经尝试了 $JAVA_HOME/jre/lib/security/java.security 中 ssl.KeyManagerFactory.algorithm=IbmX509 和 ssl.TrustManagerFactory.algorithm=PKIX 的各种设置,因此非常感谢您提出一些具体的解决方案建议。
    • 我现在也尝试在 server/default/jboss-service.xml (pastebin.com/RW21nExF) 中指定配置,但没有任何运气。我怎样才能让这个错误消失?
    • 很抱歉没有注意到您的 cmets 对我的回答。我不知道为什么我没有这样做。
    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 2014-09-04
    • 2012-08-24
    • 2012-12-07
    • 2013-06-29
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多