我們使用標準的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