带有 x509 但没有 sprint/cf/metro 等的简单 Java soap 客户端
Simple Java soap client with x509 but without sprint/cf/metro etc
我需要使用 x509 安全连接到 soap 服务器。
客户端应该是一个简单的 java 程序,从命令行调用。我有一个 WSDL 文件,我通过 wsimport 从中生成了 java 源代码。
如何签署通信?我只使用 Spring、CF 等找到答案,但我有 Java SE。
SSL/TLS two-way authentication 机制是指两方同时互相认证。客户端在 SSL/TLS 握手期间使用数字证书创建安全通道
签署 SOAP 请求意味着使用数字证书签署 soap 消息的 body 并将 XML 签名嵌入 SOAP header 以供服务器验证
验证机制不同,很难同时找到,但它是正确的。我可以为您提供一些链接来执行每个步骤
首先你需要
- 带有服务器 SSL 证书的信任库
- 带有 SSL 客户端证书的密钥库
- 带有 SOAP 签名证书的密钥库(可以相同)
密钥库可以是 JKS 或 PKCS#12 格式。如果您从未使用过密钥库,我建议使用 portecle GUI 工具
两种认证方式
您需要创建一个 SSLContext,用密钥库和信任库初始化并在 urlconnection 中设置上下文
KeyStore keystore = KeyStore.getInstance("pkcs12");
keystore.load(new FileInputStream("clientstore.p12"), keystorePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keystore, keystorePassword);
KeyStore truststore = KeyStore.getInstance(KeyStore.getDefaultType());
truststore.load(new FileInputStream("truststore.jks"), truststorePassword);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(truststore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
URL url = new URL("https://yourservice.com");
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
SSLSocketFactory sslSocketFactory = context.getSocketFactory();
urlConnection.setSSLSocketFactory(sslSocketFactory);
您还可以使用系统属性来定义密钥库
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever
签名香皂
JAX-WS 与 JDK 1.6 捆绑在一起。您可以使用它来调用 SOAP Web 服务,但通常使用 WS-Security 框架(如 WSS4J)来签署 SOAP。我为您提供了一些链接以在没有它的情况下执行签名
Sign JAX-WS SOAP request
勾选这个link
我需要使用 x509 安全连接到 soap 服务器。
客户端应该是一个简单的 java 程序,从命令行调用。我有一个 WSDL 文件,我通过 wsimport 从中生成了 java 源代码。
如何签署通信?我只使用 Spring、CF 等找到答案,但我有 Java SE。
SSL/TLS two-way authentication 机制是指两方同时互相认证。客户端在 SSL/TLS 握手期间使用数字证书创建安全通道
签署 SOAP 请求意味着使用数字证书签署 soap 消息的 body 并将 XML 签名嵌入 SOAP header 以供服务器验证
验证机制不同,很难同时找到,但它是正确的。我可以为您提供一些链接来执行每个步骤
首先你需要
- 带有服务器 SSL 证书的信任库
- 带有 SSL 客户端证书的密钥库
- 带有 SOAP 签名证书的密钥库(可以相同)
密钥库可以是 JKS 或 PKCS#12 格式。如果您从未使用过密钥库,我建议使用 portecle GUI 工具
两种认证方式
您需要创建一个 SSLContext,用密钥库和信任库初始化并在 urlconnection 中设置上下文
KeyStore keystore = KeyStore.getInstance("pkcs12");
keystore.load(new FileInputStream("clientstore.p12"), keystorePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keystore, keystorePassword);
KeyStore truststore = KeyStore.getInstance(KeyStore.getDefaultType());
truststore.load(new FileInputStream("truststore.jks"), truststorePassword);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(truststore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
URL url = new URL("https://yourservice.com");
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
SSLSocketFactory sslSocketFactory = context.getSocketFactory();
urlConnection.setSSLSocketFactory(sslSocketFactory);
您还可以使用系统属性来定义密钥库
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever
签名香皂
JAX-WS 与 JDK 1.6 捆绑在一起。您可以使用它来调用 SOAP Web 服务,但通常使用 WS-Security 框架(如 WSS4J)来签署 SOAP。我为您提供了一些链接以在没有它的情况下执行签名 Sign JAX-WS SOAP request
勾选这个link