带有 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