2012-08-07 3 views
6

나는 상호 SSL 인증을 사용하는 웹 서비스를 가지고있다. 클라이언트 인증서를 설치하면 브라우저에서 제대로 액세스 할 수 있습니다.서버가 클라이언트 인증서를 기대할 때 wsimport를 사용하는 방법?

서비스에 액세스하기위한 Java 코드를 생성하려면 wsimport을 사용하여 액세스 할 수 있어야합니다.

wsimport을 사용하여 URL에 액세스 할 수 있도록 내 자격 증명을 설정하려면 어떻게해야합니까?

다음은 내가 시도하는 예입니다. 그러나 인증 할 수 없기 때문에 시간이 초과되었습니다. 어떤 도움

wsimport ./sample.wsdl -p com.company.ws.sample -Xnocompile -d ./src -extension -keep -XadditionalHeaders

감사

편집 :

이 무엇 wsimport 인쇄입니다. WSDL에 확실히 유효하며, 지정된 위치에, 그것은 인증 내 자격 증명을 전달하는 방법을 알아내는의 문제 :

wsimport https://wsdl.location.com?WSDL -p com.company.ws.sample -Xnocompile 
-d ./src -extension -keep -XadditionalHeaders 


parsing WSDL... 

[ERROR] Received fatal alert: handshake_failure 

Failed to read the WSDL document: "https://wsdl.location.com?WSDL", because 1) could 
not find the document; /2) the document could not be read; 3) the root element of 
the document is not <wsdl:definitions>. 

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

At least one WSDL with at least one service definition needs to be provided. 

    Failed to parse the WSDL. 
+0

오류/예외 스택 추적을 공유하면 다른 사람들이 문제를 이해하는 데 도움이됩니다. – sundar

+0

게시물을 업데이트하여 자세한 내용을 표시했습니다. 감사합니다 – Cuga

+0

http://ibswings.blogspot.in/2008/12/running-axis-wsdl2java-on-https-wsdl.html 이것을 시도하십시오 – sundar

답변

8

직접 wsimport의 자바 클래스 (source)를 호출 할 수 있고 JVM이 필요한 추가 Java가 클라이언트 인증서를 찾을 위치를 아는 지 확인합니다.

java -classpath C:\jdk160_29\lib\tools.jar -Djavax.net.ssl.trustStore=c:\jdk160_29\.mykeystore com.sun.tools.internal.ws.WsImport https://host:8443/Webservice?wsdl -p com.test -s ./src" 

같은

뭔가 트릭을 할해야합니다.

+2

트릭을해야합니다 +1 – RamonBoza

+0

실패했습니다 나 '스레드에서 예외 "메인"java.lang.NoSuchFieldError : theInstance'와 함께, 그러나 나는 대안을 발견했습니다. –

3

전달할 여분의 시스템 속성이 모두있는 _JAVA_OPTIONS 환경 변수를 설정하여이 작업을 관리했습니다. 윈도우 배치 파일이 적절에 암호를 넣어 (다음과 같습니다

setlocal 
set _JAVA_OPTIONS=%_JAVA_OPTIONS% -Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} -Djavax.net.ssl.keyStore=r:\cert.pfx 
wsimport -s . -verbose https://your.host.name/path/to/service?wsdl 
endlocal 

정신의 위해, 긴 '설정'줄의 자바 옵션은 다음과 같습니다

-Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" 
-Djavax.net.ssl.keyStoreType=PKCS12 
-Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} 
-Djavax.net.ssl.keyStore=R:\cert.pfx 

당신 수도 있고 trustStore 설정을 지정할 필요가 없을 수도 있습니다. 설치를 몇 번하고 Java가 나에게 잘못된 cacerts 파일을 선택하고 있습니다.

키 저장소가없는 경우 마찬가지로 keyStorePassword이 필요하지 않습니다. 암호는 보호되어 있습니다. keyStoreType, Java 키 스토어에 액세스하지 않는 경우이를 지정해야합니다.

궁극적으로 유일하게 "필수"옵션은 클라이언트 인증서와 키가있는 위치를 정의하는 keyStore이며 클라이언트 인증서가 핵심 Java 인증서 저장소에없는 경우에만 필수입니다. 위의 예는 PFX 파일의 클라이언트 인증서를 Windows 인증서 저장소에서 내보내는 방법으로 생성 한 것입니다.

2

매우 쉽게 발견했습니다 (-D, classpath 등을 사용하지 않아도됩니다) :
1. 브라우저에서 ssl을 통해 wsdl을 다운로드하십시오 (기본 브라우저에 인증서를 설치하려면 두 번 클릭하십시오. keystore) 또는 wapdl 내용을 표시하는 soapUI (config/ssl을 통해 키 스토어 설치)를 사용하는 것이 더 쉽습니다.
2. 다운로드 한 wsdl에 대해 wsimport를 실행하십시오.
그게 전부입니다.