首页 文章

使用用于grails的Apache CXF客户端插件进行双向(相互)SSL身份验证

提问于
浏览
1

我无法使Apache CXF客户端grails插件使用双向SSL身份验证 . 我正在调用的Web服务提供了一个开发环境URL,它不需要双向身份验证,一切正常 . 但是,它们提供的测试环境URL确实需要双向身份验证,而我无法使其正常工作 .

Grails应用程序在Windows服务器上的Tomcat中运行 .

我编写了一个独立的Java测试应用程序来测试双向身份验证 . 我用适当的密钥库,信任库等来调用它,它工作正常 . (这是一个纯Java应用程序 - 没有CXF . )我已将相同的Java类导入到Tomcat上运行的grails应用程序中,这也有效 . 但是,如前所述,使用CXF进行呼叫时,它不起作用 .

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

我尝试了几种不同的方法来设置密钥库和信任库参数 . 我正在启动Tomcat时使用JvmOptions来设置它们:

++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-client:2.0.3,虽然我也尝试过使用cxf-client:1.5.6 .

1 回答

  • 1

    我不熟悉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>
    

相关问题