우리는 표준 Java/SAAJ 기능을 사용하여 SOAP 메시지를 작성하고 웹 서비스 (WS) 호출을 수행합니다. 지금까지 통신은 HTTP 전송을 통해 unecrypted되었으며, 엔드 포인트에 WS를 호출하면이 방법을 사용하여 잘 작동했습니다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를 사용하기 위해 WS 코드를 다시 작성해야한다. 그리고 나는 아직 봄 - ws로 이런 종류의 암호화를하는 방법을 설명하는 their reference docs에서 예제를 발견하지 못했습니다.
통신을 암호화하는 몇 가지 쉬운 방법이 누락 되었습니까? 그렇다면 무엇입니까? 그렇지 않다면 클라이언트가 요구하는 것을 달성하기 위해 어떤 좋은 옵션이 존재합니까?
업데이트 : HTTPS를 보안 전송으로 사용하는 것은 옵션이 아닙니다.
도움을 주셔서 감사합니다.
http 전송 계층을 사용하는 경우 표준 HTTPS SSL 보안을 사용할 수 있습니다. 나는 이것이 당신이 원하는 것 (물리적으로 메시지를 암호화)과 약간 다르다고 생각하지만 설정하기 쉽다. 즉 서버 인증서를 설정하고 요청을이 SOAP 커넥터에서 SSL 포트로 리다이렉트한다. – Davos555
지적 해 주셔서 감사합니다. 불행히도 전송으로 HTTPS를 도입하는 것은 선택 사항이 아닙니다. 그에 따라 질문을 업데이트했습니다. –