我必须向安全的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);
以便Web服务可以验证我的请求。我不太熟悉在肥皂信息中使用拦截器。
答案 0 :(得分:0)
您可以对证书进行BASE-64解码,并将其导入密钥库,您可以在client-keystore.properties中引用该密钥库。
答案 1 :(得分:0)
我想出了另一个解决方案。我做的第一件事是从属性文件中读取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。