2012-06-09 2 views
2

불행하게도이 기능을 기본적으로 지원하지 않는 서버에서 ws-security 보안 웹 서비스를 호출하려고합니다. 필자가 취한 접근법은 ws-security 요소를 사용하여 요소를 추가하는 과정에서 실제 엔드 포인트 URL에 대한 역방향 프록시 역할을하는 .jsp를 구현하는 것입니다.ws-security에 대한 비밀번호 다이제스트 구현 Java의 UsernameToken

이것은 꽤 잘 작동하는 것 같습니다. XML을 올바른 네임 스페이스 등으로 올바르게 구성했다고 확신합니다. SOAP-UI에서 생성 된 XML과 XML을 비교하여이를 확인했습니다.

암호 다이제스트 생성기를 구현하는 데 문제가 있습니다. SOAP-UI가 NOnce, xsd : dateTime 및 password, 그리고 다음 코드에 대해 동일한 입력을 사용하는 것과 동일한 결과를 얻지 못합니다.

StringBuffer passwordDigestStr_ = new StringBuffer(); 

// First append the NOnce from the SOAP header 
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A==")); 

// Then append the xsd:dateTime in UTC timezone 
passwordDigestStr_.append("2012-06-09T18:41:03.640Z"); 

// Finally append the password/secret 
passwordDigestStr_.append("password"); 

System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8")); 

I 문제가 타임 스탬프가 해싱하면서 논스는 그 디코딩 된 값의 옥텟 시퀀스를 사용하여 해싱된다 http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf

참고하여 설명한 바와 같이, 제 1 두 요소의 해시를 구현하는 생각 엘리먼트의 내용에 명시된대로 UTF8 인코딩의 옥텟 시퀀스를 사용한다.

나를 미치게하기 시작한 사람이 있다면이 문제를 해결하는 데 큰 도움이 될 것입니다. 소스 코드를 제공 할 수 있다면 이상적입니다.

+0

SOAP-UI에서 샘플 입력 값과 출력 값을 게시 할 수 있습니까? 그렇게하면 SOAP-UI가 아니라 자바와 코드만으로 도울 수 있습니다. –

답변

8

나는 SOAP-UI가 없으면이를 깨뜨릴 것이다. 해시 함수에 대한 입력은 문자열이 아닌 바이트라고 가정합니다. DigestUtils.sha()을 사용하면 문자열을 사용할 수 있지만 해당 문자열을 올바르게 인코딩해야합니다. 넌스를 쓸 때 StringBuffer.append(Object)으로 전화가 걸려 결국 byte[].toString()으로 전화를 걸었습니다. 그게 [[email protected] 같은 것을 제공합니다. 확실히 당신이 원하는 것이 아닙니다. 모든 곳에서 바이트를 사용하면이 문제를 피해야합니다. 아래 예제는 사용하고있는 Base64 클래스가 아니라 org.apache.commons.codec.binary.Base64을 사용합니다. 그것은 중요하지 않습니다. 그것은 제가 가지고있는 것입니다.

ByteBuffer buf = ByteBuffer.allocate(1000); 
buf.put(Base64.decodeBase64("PzlbwtWRpmFWjG0JRIRn7A==")); 
buf.put("2012-06-09T18:41:03.640Z".getBytes("UTF-8")); 
buf.put("password".getBytes("UTF-8")); 
byte[] toHash = new byte[buf.position()]; 
buf.rewind(); 
buf.get(toHash); 
byte[] hash = DigestUtils.sha(toHash); 
System.out.println("Generated password digest: " + Base64.encodeBase64String(hash)); 
+0

빠른 답장을 보내 주셔서 감사합니다. 스 니펫을 시도했는데 내 코드와 SOAP-UI의 암호 다이제스트를 생성합니다. 내가 직면 한 문제는 문자 인코딩과 관련이 있다고 생각했습니다. StringBuffer를 사용하여 내 접근 방식을 명확하게 결함 볼 수 있습니다. SOAP-UI를 설정하고 알고리즘의 결과가 동일한 지 확인할 수 있습니다. 어쩌면 SOAP UI를 잘못 설정했을 수도 있습니다! –

+0

나는 그것을 다운로드하려했지만 즉시 작동하지 않았고 나는 그것으로 덤비는 많은 시간을 보내고 싶지 않다. SOAP UI 사본에서 입력 및 출력의 샘플 값을 첨부 할 수 있습니까? –

+0

답변을 게시하고 점수를 받았습니다. 데이터/시간 표현 측면에서이 문제를 테스트하면서 2 차 문제를 경험했습니다.이 웹 서비스 클라이언트는 영국에서 실행되며 현재 UTC + 1 = 영국 서머 타임 (BST)입니다. Howver, 현재 webservice는 표현식에 'Z'접미사가있는 dateTime 값을 예상하므로 과거 1 시간 (UTC)으로 포맷 된 날짜를 보내야 할 것으로 예상됩니다. 그러나 여전히 시간 구성 요소가 BST 시간 표현이되기를 원하며 이상하다고 생각합니다. 이것이 XML 스키마 dateTime 데이터 형식과 일치하지 않는다는 것에 동의하십니까? –

1

특히 초기 빠른 응답을 고려하면 회신이 늦어지는 것에 대해 사과드립니다. 이제는 문자 인코딩 문제를 피하기 위해 접근법의 본질을 사용하여이 작업을 수행 할 수있게되었습니다. 그러나 java.nio.ByteBuffer은 내가 문제를 일으켜서 System.arrayCopy()을 사용하여 조합 한 기본 byte[]을 사용하도록 코드를 수정했습니다. 내가 java.nio.ByteBuffer에 직면 한 문제는 적절한 바이트 수를 반환하는 'buf.position()'에도 불구하고 byte[] toHash에서 buf.get(toHash)까지 주입 된 모든 바이트가 0이었습니다!

도움을 주셔서 대단히 감사드립니다.