2010-11-23 7 views
7

Apache CXF 및 WSS4J를 사용하여 웹 서비스 요청에 서명하고 싶습니다. 내가 아는 한, 서명 할 때 사용할 인증서가 들어있는 JKS 상점이 필요합니다. Windows 인증서 저장소에서 X.509 인증서를 사용할 수 있어야한다는 요구 사항이 있습니다. 인증서는 웹 서비스 요청에 서명 할 때 상점에서 읽어야합니다. 나는 상점에 액세스하여 인증서를받는 방법을 안다. 하지만 내 JKS 상점의 인증서 대신 서명을 위해이를 어떻게 사용할 수 있습니까?웹 서비스 보안 및 Windows 인증서

+0

인증서는 서명에 사용되지 않으며 키는 있습니다. 개인 키에 액세스 할 수 있습니까? 어떤 경우 실제로 사인 할 수 있습니다. –

답변

1

KeyStore는 JKS 암호 일 필요는 없습니다. 독자적인 JCA 프로 바이더를 작성해 KeyStoreSpi를 구현해, Windows의 증명서 스토어에 액세스 할 수가 있습니다.

+0

내 대답이 유용 했습니까? – adrianboimvaser

0

Windows 키 저장소 사용 방법을 설명하는 this을 살펴보십시오. 그런 다음 해당 키 스토어를 사용하도록 CXF를 구성해야합니다.

+0

CXF에 해당 저장소 사용을 어떻게 알릴 수 있습니까? – tobiasbayer

+0

좋은 방법이없는 것처럼 보입니다. 여기에 Java-COM 브리지를 사용할 것을 제안합니다 : http://objectmix.com/java/76948-accessing-certificates-windows-system-stores-java.html. 이 답변은 JNI 지옥에 갇혀있을 것이라고 제안합니다. https://lists.owasp.org/pipermail/owasp-webscarab/2010-October/001123.html – rtperson

+0

그러나 인증서를 Active Directory에 저장하면 LDAP 및 JNDI를 통해 액세스 할 수 있습니다. 그것이 내가 권하는 것입니다. 몇 가지 샘플 코드를 원하면 알려 주시면 답변으로 게시 해 드리겠습니다. – rtperson

0

MerlinDevice 클래스를 사용하는 것이 가능하다는 것이 밝혀졌습니다. 즉, 그 수행 방법은 다음과 같습니다 WSS4JOutInterceptor에 대한

1) 구성 속성 :

Map<String,Object> outProps = new HashMap<String,Object>(); 
outProps.put(WSHandlerConstants.ACTION, "Signature"); 
outProps.put(WSHandlerConstants.USER, "Friendly_name_of_your_certificate"); 
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, StupidCallback.class.getName()); 
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "client_sign.properties"); 
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 

2)는 client_sign.properties 파일은 다음과 같습니다 :

org.apache.ws.security.crypto.provider=org.apache.wss4j.common.crypto.MerlinDevice 
keystore.provider=SunMSCAPI 
cert.provider=SunMSCAPI 
keystore.type=Windows-MY 
truststore.type=Windows-ROOT 

3) 그리고 StupidCallback 단지로 상수 문자열을 반환 비밀번호 (값은 중요하지 않음) :

public class StupidCallback implements CallbackHandler 
{ 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException 
    { 
     WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 
     pc.setPassword("password"); 
    } 
} 

그게 전부입니다.