我们使用标准的Java/SAAJ功能来创建SOAP消息并执行Web服务(WS)调用。到目前为止,通信已跨unecrypted HTTP传输和调用端点上的WS已使用这种方法工作得很好:用于Java SOAP的Blowfish加密与SAAJ的SOAP调用
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();
现在,我们的客户希望我们使用加密河豚的所有流量。我知道我可以用下面简单的方法进行加密任意数据(这个例子只是使用一个随机密钥):
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
等)似乎根本不支持任何加密。我已经看到,春天的WebServiceTemplate
支持ClientInterceptor
实例,这可能有助于这一点。不过,我必须重写我们的WS代码才能使用spring-ws。我还没有在their reference docs中找到一个例子,它解释了如何使用spring-ws来完成这种加密。
我错过了加密通信的一些简单方法吗?如果是,那是什么?如果没有,有哪些好的选择来实现客户的要求?
更新:使用HTTPS作为安全传输不是一种选择。
非常感谢您的帮助。
如果您使用http传输层,则可以使用标准HTTPS SSL安全性。我认为这与你想要做的事情稍有不同(物理加密消息),但很容易设置 - 即设置服务器证书,将请求重定向到此SOAP连接器以SSL端口。 – Davos555 2012-07-30 12:36:53
谢谢你指出。不幸的是,将HTTPS作为传输方式不是一种选择。我已经相应地更新了这个问题。 – 2012-07-30 12:51:07