標準の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を使用してペイロードを暗号化し、応答を受信したときに復号化できるように、これら2つの部分を組み合わせるにはどうすればよいですか。
Javaが提供する標準機能(SOAPMessage
などSOAPConnection
)は、暗号化をまったくサポートしていないようです。Springがそれを助けるかもしれないインスタンスをWebServiceTemplate
サポートしているのを見てきました。ClientInterceptor
ただし、その場合、spring-wsを使用するようにWSコードを書き直す必要があります。そして、私は彼らのリファレンスドキュメントで、spring-wsを使用してこの種の暗号化を行う方法を説明する例をまだ見つけていません。
通信を暗号化する簡単な方法がありませんか?はいの場合、それは何ですか?そうでない場合、クライアントが求めていることを達成するためにどのような良いオプションがありますか?
更新:安全なトランスポートとしてHTTPSを使用することはオプションではありません。
どうもありがとうございました。