WSS4JInInterceptor 使用 base64 证书

WSS4JInInterceptor using base64 certificate

我必须向安全的 Web 服务发送 SOAP 请求,并且我获得了 base64 格式的客户端证书。我如何使用它来保护对 Java 中 Web 服务的调用?我正在使用 CXF 客户端和 Grails 1.3.7。我希望能够加密证书或将证书添加到我的 SOAP 请求中,如下所示:

Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ENC_PROP_FILE, "client-keystore.properties");
outProps.put(WSHandlerConstants.ENC_KEY_ID, "DirectReference");
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.ENCRYPT);
outProps.put(WSHandlerConstants.ENCRYPTION_USER, "myAlias");
outProps.put(WSHandlerConstants.ENC_SYM_ALGO, "http://www.w3.org/2001/04/xmlenc#aes128-cbc");
outProps.put(WSHandlerConstants.ENC_KEY_TRANSPORT, "http://www.w3.org/2001/04/xmlenc#rsa-1_5");
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
client.getEndpoint().getOutInterceptors().add(wssOut);

以便网络服务可以验证我的请求。我不太熟悉在 soap 消息上使用拦截器。

您可以使用 BASE-64 解码证书,并将其导入到您在客户端中引用的密钥库中-keystore.properties。

我想出了另一个解决方案。我做的第一件事是从属性文件中读取 base64 字符串,解析它并保存到 pfx 文件:

// certStr = base64 string from properties file
byte[] cert = DatatypeConverter.parseBase64Binary(certStr);
FileOutputStream fos = new FileOutputStream(new File("C:/mycert.pfx"));
fos.write(cert);
fos.flush();
fos.close();

然后将其用作密钥库:

// keystore file
File keyFile = new File("C:/mycert.pfx");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream keyInput = new FileInputStream(keyFile);
keyStore.load(keyInput, pKeyPassword.toCharArray());
keyInput.close();
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());
KeyManager[] km = keyManagerFactory.getKeyManagers();
SSLContext context = SSLContext.getInstance("TLS");
context.init(km, null, new java.security.SecureRandom());
SSLSocketFactory sslFactory = context.getSocketFactory();
conn.setSSLSocketFactory(sslFactory);

证书已添加到我的 SOAP 请求中,毕竟我不必对请求进行加密。参考 here.