web-services - 在 Apache Axis 1 中使用客户端证书

标签 web-services tomcat axis client-certificates

先决条件

  • Apache Tomcat 7
  • Spring 3.2.11.RELEASE
  • Apache Camel 2.14.1
  • Apache Axis 1 (1.4)
  • keystore ,包括客户端证书(私钥、公钥等):my_keystore.p12

问题

我正在尝试使用 Apache Axis 1 访问远程 rpc/编码的 werbservice。

由于 web 服务的 rpc/encoded 风格,必须使用 Apache Axis 1。

网络服务受 my_keystore.p12 中包含的客户端证书的保护。 与远程服务器的双向 SSL 握手需要客户端证书(我的应用程序是客户端)---> 客户端检查它是否与正确的服务器对话,服务器检查它是否与正确的客户端对话。 文件 my_keystore.p12 包含在 Apache Tomcat 的类路径中。

我使用以下单元测试测试了连接:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:spring-test-config.xml")
    public class MyClientTest {

            private static MyWebservices webservices;

            @BeforeClass
            public static void initializeWebservices()  throws IllegalStateException {
                    if (webservices == null ) {
                    URL servicesUrl;
                    try {
                            servicesUrl = new URL("https://examplehost.com/abcd/abcdefg/rpcrouter");

                            AxisProperties.getProperties().put("proxySet", "true");
                            AxisProperties.setProperty("http.proxyHost", "11.222.333.44");
                            AxisProperties.setProperty("http.proxyPort", "80");

                            AxisProperties.setProperty("keystore", "my_keystore.p12");
                            AxisProperties.setProperty("keystorePassword", "abc");
                            AxisProperties.setProperty("keystoreType", "pkcs12");

                    } catch (MalformedURLException e) {
                            throw new IllegalStateException(e.getMessage());
                    }
                    try {
                            webservices = new MyWebservicesServiceLocator().getrpcrouter(servicesUrl);
                    } catch (ServiceException e) {
                            throw new IllegalStateException(e.getMessage());
                    }
                    }
            }

            @Test
            public void testConnection() throws Exception {
                    webservices.doSomething("2");
            }

    }

出现以下异常:

    javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
            at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
            at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
            at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
            at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
            at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
            at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
            at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
            at org.apache.axis.client.Call.invoke(Call.java:2767)
            at org.apache.axis.client.Call.invoke(Call.java:2443)
            at org.apache.axis.client.Call.invoke(Call.java:2366)
            at org.apache.axis.client.Call.invoke(Call.java:1812)

我认为问题在于 keystore 不是按 Axis 读取的。 是否可以将客户端证书与 Apache Axis 1 一起使用?

提前致谢

最大

最佳答案

解决方案是对信任库和 keystore 使用 JVM 参数。

java 
-Djavax.net.ssl.trustStore=/some/path/myTruststore.jks
-Djavax.net.ssl.trustStorePassword=abc

-Djavax.net.ssl.keyStore=/some/path/myKeystore.p12
-Djavax.net.ssl.keyStorePassword=defg
-Djavax.net.ssl.keyStoreType=PKCS12

关于web-services - 在 Apache Axis 1 中使用客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30802968/

相关文章:

php - 将某些命名空间添加到 PHP 中的 SOAP 信封

web-services - Java 网络服务不适用于 Jdk 6 和 Jboss 5.x

java - 使用 Servlet+JSON+MySQL 配置 Web 服务和瘦客户端

java - "The type Java.util.Map$Entry cannot be resolved"

java - 这个 Java 错误消息意味着什么?我该如何解决它?

java - java(jax-ws)网络服务和.net网络服务之间的区别?

web-services - SoapUI 响应中的“不理解 "MustUnderstand" header ”错误

java - 在 tomcat Docker 容器上部署 .war

java - 使用 JfreeChart XYLineChart 自定义 x Axis

java - 摆脱 Axis 中的 client-config.wsdd