Java 用于grails的ApacheCxf客户端插件的双向(相互)SSL身份验证

Java 用于grails的ApacheCxf客户端插件的双向(相互)SSL身份验证,java,tomcat,grails,ssl,cxf,Java,Tomcat,Grails,Ssl,Cxf,我无法使ApacheCXF客户端grails插件与双向SSL身份验证一起工作。我调用的web服务提供了一个开发环境URL,它不需要双向身份验证,而且一切正常。然而,他们提供的测试环境URL确实需要双向身份验证,我一直无法使其正常工作 grails应用程序正在Windows服务器上的Tomcat中运行 我已经编写了一个独立的Java测试应用程序来测试双向身份验证。我用适当的密钥库、信任库等来调用它,它工作得很好。(这是一个纯Java应用程序——不是CXF。)我已经将同一个Java类导入到运行在To

我无法使ApacheCXF客户端grails插件与双向SSL身份验证一起工作。我调用的web服务提供了一个开发环境URL,它不需要双向身份验证,而且一切正常。然而,他们提供的测试环境URL确实需要双向身份验证,我一直无法使其正常工作

grails应用程序正在Windows服务器上的Tomcat中运行

我已经编写了一个独立的Java测试应用程序来测试双向身份验证。我用适当的密钥库、信任库等来调用它,它工作得很好。(这是一个纯Java应用程序——不是CXF。)我已经将同一个Java类导入到运行在Tomcat上的grails应用程序中,这也很有效。但是,如前所述,当使用CXF调用时,它不起作用

我在Tomcat中打开了-Djavax.net.debug=ssl,可以看到当服务器发送CertificateRequest消息时,客户端没有发回证书。(当使用Java类时,客户端会使用正确的证书进行响应。)

我尝试了几种不同的方法来设置密钥库和信任库参数。我目前正在启动Tomcat时使用++JVM选项设置它们:

++JvmOptions
-Xrs;
-Djavax.net.debug=ssl;
-Djavax.net.ssl.trustStore=C:\path\to\truststore.jks;
-Djavax.net.ssl.keyStore=C:\path\to\keystore.jks;
-Dhttps.cipherSuites=SSL_RSA_WITH_3DES_EDE_CBC_SHA;
-Djavax.net.ssl.keyStorePassword=password;
-Djavax.net.ssl.trustStorePassword=password

我目前正在使用cxf客户端:2.0.3,尽管我也尝试过使用cxf客户端:1.5.6。

我不太熟悉grails,但您的cxf客户端调用看起来如何?是否将密钥库/信任库添加到http管道

例如:

<http:conduit name="https:...">
    <http:tlsClientParameters>
        <sec:trustManagers>
                <sec:keyStore type="JKS" password="password" file="..."/>
            </sec:trustManagers>
            <sec:keyManagers keyPassword="password">
                <sec:keyStore type="JKS" password="password" file="..."/>
            </sec:keyManagers>
        <sec:cipherSuitesFilter>
        ...
        </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
    <http:client AutoRedirect="true" Connection="Keep-Alive"/>   
</http:conduit>

...

我没有,但我认为这在grails插件中是不可能的。有人能证实吗?另外,我的理解是,它应该从Java继承这些设置。