我们使用标准 Java/SAAJ 功能来创建 SOAP 消息并执行 Web 服务 (WS) 调用。到目前为止,跨 HTTP 传输的通信未加密,并且使用这种方法在端点上调用 WS 可以正常工作:
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection con = scf.createConnection();
URL endpoint = new URL(endpointUrl); // configured HTTP URL
// "message" is passed as parameter (a SOAPMessage object)
SOAPMessage response = con.call(message, endpoint);
con.close();
现在我们的客户希望我们使用 Blowfish 加密所有流量。我知道我可以使用以下简单方法加密任意数据(此示例仅使用随机密钥):
KeyGenerator kgen = KeyGenerator.getInstance("Blowfish");
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
String inputString = "This is just an example";
byte[] encrypted = cipher.doFinal(inputString.getBytes());
Cipher decCipher = Cipher.getInstance("Blowfish");
decCipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = decCipher.doFinal(encrypted);
assertEquals(inputString, new String(decrypted));
但是,缺少的链接是:如何将这两个部分放在一起,以便我可以使用 Blowfish 加密有效负载并在收到响应后对其进行解密?
Java 提供的标准工具(SOAPMessage
等SOAPConnection
)似乎根本不支持任何加密。我已经看到 SpringWebServiceTemplate
支持的ClientInterceptor
实例可能对此有所帮助。但是,我将不得不重写我们的 WS 代码以使用 spring-ws。而且我还没有在他们的参考文档中找到解释如何使用 spring-ws 进行这种加密的示例。
我错过了一些加密通信的简单方法吗?如果是,那是什么?如果没有,有哪些好的选择可以实现客户的要求?
更新:使用 HTTPS 作为安全传输不是一种选择。
非常感谢你的帮助。