2016-06-17 4 views
0

Java에서 JAX-WS 클라이언트를 프로그래밍하고 있습니다. WebService에 대한 액세스는 클라이언트 인증서로 보호됩니다. 클라이언트 인증서를 가져온 경우에만 Firefox에서 WSDL을 가져올 수 있기 때문에 클라이언트 인증서가 옳다는 것을 알고 있습니다 (Firefox).JAX-WS 클라이언트 및 클라이언트 인증서 인증에서 클라이언트 인증서를 지정하는 방법

하지만 WebService를 사용해야하는 Java 응용 프로그램을 작성하는 데 문제가 있습니다. 내가 한 일은 다음과 같습니다 :

MyOwnService svc = new MyOwnService(getServerURL(), MYOWNSERVICE_QNAME); 
... 
... 
private URL getServerURL() throws IOException { 
    URL url = new URL((String) cfg.get(ConfigData.SERVER_URL)); 

    HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 

    try { 
    con.setSSLSocketFactory(getFactory(new File("/etc/pki/wildfly/client.keystore"), "123456")); 
    } catch (Exception exc) { 
    throw new IOException("Client certificate error!", exc); 
    } 

    return url; 
} 

private SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword) 
    throws ... { 

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 
    KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

    InputStream keyInput = new FileInputStream(pKeyFile); 
    keyStore.load(keyInput, pKeyPassword.toCharArray()); 
    keyInput.close(); 

    keyManagerFactory.init(keyStore, pKeyPassword.toCharArray()); 

    SSLContext context = SSLContext.getInstance("TLS"); 
    context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 

    return context.getSocketFactory(); 
} 

그러나 이것은 작동하지 않았습니다. 나는 MyOwnService 생성자

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty. 

이 난 다음받을 예외를 실행하면 어떻게 클라이언트 인증을 지원하는 JAX-WS 클라이언트를 implemnting하는 올바른 방법은 무엇입니까?

답변

0

위의 코드를 잊어 버리십시오. 난 그렇게하고 작동 올바른 키 스토어를 지정 할 경우

-Djavax.net.ssl.keyStore=/etc/pki/wildfly/client.keystore -Djavax.net.ssl.keyStorePassword=123456 

: 것 당신이해야 할 유일한 것은이 같은 환경 변수로 키 스토어를 지정하는 것입니다이다. 잘못된 키 저장소 파일 (다른/잘못된 인증서/키 포함)을 지정하면 작동하지 않습니다.

그러나 키 스토어에 더 많은 키가 포함되어있는 경우 자바가 올바른 키/인증서를 얻는 방법을 모르겠다 PrivateKeyEntry. javax.net.ssl.keyStoreAlias을 지정하면 아무 효과가 없습니다. Java가 올바른 키가 발견 될 때까지 PrivateKeyEntry을 시도 할 수 있습니다 ...

그러나 유일한 방법은 환경 변수로 올바른 키 스토어를 지정하는 것입니다.