在 Apache Axis 1 中使用客户端证书
Using client certificate with Apache Axis 1
先决条件
- 阿帕奇 Tomcat 7
- Spring 3.2.11.RELEASE
- 阿帕奇骆驼 2.14.1
- Apache 轴 1 (1.4)
- 包含客户端证书的密钥库(私钥,public 密钥等):my_keystore.p12
问题
我正在尝试使用 Apache Axis 1 访问远程 rpc/encoded 网络服务。
由于 Web 服务的 rpc/encoded 风格,必须使用 Apache Axis 1。
Web 服务受 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)
我认为问题是密钥库不是由轴读取的。
是否可以将客户端证书与 Apache Axis 1 一起使用?
提前致谢,
最大
解决方案是对信任库和密钥库使用 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
先决条件
- 阿帕奇 Tomcat 7
- Spring 3.2.11.RELEASE
- 阿帕奇骆驼 2.14.1
- Apache 轴 1 (1.4)
- 包含客户端证书的密钥库(私钥,public 密钥等):my_keystore.p12
问题
我正在尝试使用 Apache Axis 1 访问远程 rpc/encoded 网络服务。
由于 Web 服务的 rpc/encoded 风格,必须使用 Apache Axis 1。
Web 服务受 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)
我认为问题是密钥库不是由轴读取的。 是否可以将客户端证书与 Apache Axis 1 一起使用?
提前致谢,
最大
解决方案是对信任库和密钥库使用 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