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

标签 java tomcat grails ssl cxf

我无法使 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/

相关文章:

Tomcat 的 PowerShell 内存使用情况

grails - 如何在 Grails 脚本中访问服务?

java - 如何使一个函数只能被某些类访问?

java - 使用javamail发送邮件时出错

java - tomcat 服务器中的性能问题 Sqlite

tomcat - 如何在Tomcat中为ServletContext日志设置字符编码

grails - 模块化 Grails 应用程序 (Grails 2.3.x)

selenium - Grails cucumber 和 Geb - 在 firefox 和 cucumber 方法中运行测试

java - 结果集返回空值

java - Xerces-for-Android 使用 Jar 而不是源代码时出现 NoClassDefFoundError