我无法使 Apache CXF 客户端 grails 插件使用双向 SSL 身份验证。我调用的web服务提供了一个开发环境URL,不需要双向认证,一切正常。但是他们提供的测试环境URL确实需要双向认证,我一直没能搞定。
grails 应用程序在 Windows 服务器上的 Tomcat 中运行。
我已经编写了一个独立的 Java 测试应用程序来测试双向身份验证。我用适当的 keystore 、信任库等调用它,它工作正常。 (这是一个纯 Java 应用程序——没有 CXF。)我已经将这个相同的 Java 类导入到运行在 Tomcat 上的 grails 应用程序中,这也有效。但是,如前所述,当使用 CXF 调用时,它不起作用。
我在 Tomcat 中打开了 -Djavax.net.debug=ssl 并且可以看到当服务器发送 CertificateRequest 消息时客户端没有发回证书。 (当使用 Java 类时,客户端会使用正确的证书进行响应。)
我尝试了几种不同的方法来设置 keystore 和信任库参数。我目前在启动 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。
最佳答案
我对 grails 不是很熟悉,但是您的 cxf 客户端调用看起来如何?您是否将 keystore /信任库添加到 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>
关于java - 使用 grails 的 Apache CXF 客户端插件进行双向(相互)SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27388864/