2012-08-10 3 views
3
public class ResLookupGetService extends Service { 
    ServerServicePortType getServerServicePort(); 
} 
public interface ServerServicePortType { 
    ServerServiceResponse doSoapMethod(RequestObject request, ParamObject parameters); 
} 

ServerServicePortType service = new ServerServiceGetService().getServerServicePort(); 
ServerServiceResponse response = service.doSoapMethod(request, parameters); 

위의 코드는 상호 SSL 암호화가 필요하기 전에 SOAP 서비스를 호출 할 때 잘 작동합니다.상호 SSL을 사용하는 SOAP - 자격 증명을 보내는 방법은 무엇입니까?

이 켜져 일단, 내가 SSL 컨텍스트를 만들고과 같이 설정해보십시오 :

ServerServicePortType service = new ServerServiceGetService().getServerServicePort(); 

BindingProvider bindingProvider = (BindingProvider) service; 
    bindingProvider.getRequestContext().put(
     "com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", 
     getSslContext().getSocketFactory()); 

ServerServiceResponse response = service.doSoapMethod(request, parameters); 

그리고 코드를 SSLContext 만들 :

public SSLContext getSslContext(String keyStorePath, String keyStoreType, String trustStorePath) { 
    KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
    InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath); 
    keyStore.load(ksis, "mypassword".toCharArray()); 
    ksis.close(); 

    KeyStore trustStore = KeyStore.getInstance("JKS"); 
    InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath); 
    trustStore.load(tsis, "mypassword".toCharArray()); 
    tsis.close(); 

    TrustManagerFactory tmf = 
     TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    tmf.init(trustStore); 

    KeyManagerFactory kmf = 
     KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(keyStore, "mypassword".toCharArray()); 

    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
    return sslContext; 
} 

를하지만하지 않는 것 내 자격 증명을 올바르게 전달해야합니다. 이것을 올바르게 설정하고 있습니까?

감사

답변

2

BindingProvider가하는만을 사용하여, 밝혀 (또는 차이를 만든 경우 적어도 나는 지점으로 사용할 수 없습니다).

웹 서비스를 호출하는 호출하기 전에, 나는 단순히 설정이 시스템 속성 :

private void setSystemProps() { 

    String keyStoreFileName = "ssl/clientKeyStore.jks"; 
    String keyStorePath = ClassLoader.getSystemResource(keyStoreFileName).getPath(); 
    String keyStoreType = "JKS"; 
    String keyStorePassword = "mypassword"; 

    String trustStoreFileName = "ssl/clientTruststore.jks"; 
    String trustStorePath = ClassLoader.getSystemResource(trustStoreFileName).getPath(); 
    String trustStoreType = "JKS"; 
    String trustStorePassword = "mypassword"; 

    Properties systemProps = System.getProperties(); 
    systemProps.put("javax.net.ssl.keyStore", keyStorePath); 
    systemProps.put("javax.net.ssl.keyStorePassword", trustStorePassword); 
    systemProps.put("javax.net.ssl.keyStoreType", keyStoreType); 

    systemProps.put("javax.net.ssl.trustStore", trustStorePath); 
    systemProps.put("javax.net.ssl.trustStoreType", trustStoreType); 
    systemProps.put("javax.net.ssl.trustStorePassword", keyStorePassword); 
    System.setProperties(systemProps); 
    } 

가 그럼 난 보통 같은 서비스 호출을 수행 할 수 있습니다

ServerServicePortType service = new ServerServiceGetService().getServerServicePort(); 
ServerServiceResponse response = service.doSoapMethod(request, parameters); 

을 그것은 주목할 가치가 때 I 시스템 속성을 설정하는 중, 그들은 값으로 Object을 수락하고, 원래 문자열이 아닌 URL 객체로 잘못 설정했습니다.

"/Users/username/path/to/directory/with/ssl/clientKeyStore.jks" 

지금 모든 작품 :

그래서 trustStorePathkeyStorePath 변수는 다음과 같은 절대 파일 경로를 인 .getPath() 값으로 설정되고있다.

관련 문제