2013-04-15 3 views
6

저는 Apache CXF를 사용하여 웹 서비스를 구축하고 있습니다. Apache WSS4J를 사용하여 WS-Security 기능을 제공합니다. SOAP 요청을해야하고 서명해야합니다.WSS4J가 콜백에서 키 저장소 비밀번호를로드하는 방법은 무엇입니까?

org.apache.ws.security.crypto.provider = org.apache.ws.security.components.crypto.Merlin 
org.apache.ws.security.crypto.merlin.keystore.type = PKCS12 
org.apache.ws.security.crypto.merlin.keystore.provider = BC 
org.apache.ws.security.crypto.merlin.keystore.password = 12345678 
org.apache.ws.security.crypto.merlin.keystore.alias = my-alias 
org.apache.ws.security.crypto.merlin.keystore.file = my_certificate.p12 

내가 내 암호가 일반 텍스트로 작성과 그 라인을 제거하려면 :

은 속성의 내용이 내가 WSS4J에 전달 파일입니다. 나는 그 라인을 제거하고 위의 코드처럼, 내 WSS4JOutInterceptor에 암호 콜백 핸들러를 제공 :

public SoapInterceptor newSignerInterceptor() { 
    Map<String, Object> outProps = new HashMap<String, Object>(); 
    outProps.put(WSHandlerConstants.ACTION, "Signature"); 
    outProps.put(WSHandlerConstants.USER, config.getKeyAlias()); 
    outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference"); 
    outProps.put(WSHandlerConstants.USE_REQ_SIG_CERT, WSHandlerConstants.SIGNATURE_USER); 
    outProps.put(WSHandlerConstants.USE_SINGLE_CERTIFICATE, "false"); 
    outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, this.getClass().getName()); 
    outProps.put(WSHandlerConstants.SIG_PROP_FILE, config.getPropertiesFileName()); 
    return new WSS4JOutInterceptor(outProps); 

} 

@Override 
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
    for (int i = 0; i < callbacks.length; i++) { 
     if (callbacks[i] instanceof WSPasswordCallback) { 
      ((WSPasswordCallback) callbacks[i]).setPassword(password); 
     } 
    } 
} 

그러나 그것은 작동하지 않았다. 특성 파일에서 암호를 찾지 않고 기본 암호 인 "보안"을 사용합니다.

암호를 가져 오기 위해 콜백을 사용하는 방법은 무엇입니까?

public class PasswordCallbackHandler implements CallbackHandler { 

    @Override 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
     for(Callback callBack:callbacks){ 
      if(callBack instanceof WSPasswordCallback){ 
       ((WSPasswordCallback)callBack).setPassword("password"); 
      } 
     } 
    } 
} 

다음 속성에 처리기를 추가 : 당신은 또한 핸들러의 기준을 설정하는 PW_CALLBACK_REF을 사용할 수 있습니다

outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordCallbackHandler.class); 

답변

-1

Merlin은 Keystore 암호에 대한 콜백을 호출하지 않으므로 암호는 항상 등록 정보 파일에 있어야합니다. 다행히도 암호화 할 수 있습니다.

이 솔루션은 잘 여기에 설명되어 있습니다 : Encrypting passwords in Crypto property files

위의 링크에서

복사 솔루션 :

  1. 이 함께 인코딩 된 암호를 얻기 jasypt-1.9.2-dist.zip
  2. 다운로드 명령 encrypt input=real_keystore_password password=master_password algorithm=PBEWithMD5AndTripleDES
  3. OUTPUT (예제 : 0laAaRahTQJzlsDu771tYi)
  4. 이 알고리즘을 사용하는 것처럼 자바 암호화 확장 (JCE) 무제한 강도가 필요합니다. JDK를 넣으십시오.

    public class WsPasswordHandler implements CallbackHandler { 
    @Override 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
    
        for (Callback callback: callbacks){ 
         WSPasswordCallback pwdCallback= (WSPasswordCallback) callback; 
         final int usage =pwdCallback.getUsage(); 
         if (usage == WSPasswordCallback.SIGNATURE || usage==WSPasswordCallback.DECRYPT) { 
         pwdCallback.setPassword("parKeyPassword"); 
        } 
        if (usage==WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD){ 
         pwdCallback.setPassword("master_password"); 
        } 
        }   
    } 
    

    }

:
  • 는 master_password 당신이 하나를 인 코드 생성 에 사용 느릅 나무 넣어 해 CallbackHandler의 속성에

    org.apache.wss4j.crypto.provider=org.apache.wss4j.common.crypto.Merlin 
    
    org.apache.wss4j.crypto.merlin.keystore.type=jks 
    org.apache.wss4j.crypto.merlin.keystore.password=ENC(0laAaRahTQJzlsDu771tYi) 
    
    org.apache.wss4j.crypto.merlin.keystore.alias=my_alias 
    org.apache.wss4j.crypto.merlin.keystore.file=/etc/cert/my_keystore.jks 
    
  • 를 인코딩 된 출력을 넣어