Java 6을 HttpsURLConnection
사용하고 있으며 클라이언트 인증서를 사용하여 원격 서버에 대해 생성하려고합니다 .
서버는 자체 서명 된 루트 인증서를 사용하고 있으며 암호로 보호 된 클라이언트 인증서를 제공해야합니다. /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5) 에서 찾은 기본 Java 키 저장소에 서버 루트 인증서와 클라이언트 인증서를 추가했습니다 . 키 저장소 파일의 이름이 클라이언트 인증서가 거기에 들어가면 안된다는 것을 암시하는 것 같습니다.
어쨌든이 저장소에 루트 인증서를 추가하면 악명 높은 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
그러나 이제는 클라이언트 인증서를 사용하는 방법에 대해 고민하고 있습니다. 나는 두 가지 접근 방식을 시도했지만 어느 쪽도 나를 어디로 향하지 않습니다.
먼저, 선호하는 방법은 다음과 같습니다.
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
HttpsURLConnection 클래스를 건너 뛰려고 시도했습니다 (서버와 HTTP를 대화하고 싶기 때문에 이상적이지 않음). 대신 다음을 수행합니다.
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
여기에서 클라이언트 인증서가 문제인지 확실하지 않습니다.