Tôi đang sử dụng Java 6 và đang cố gắng tạo một HttpsURLConnection
máy chủ từ xa chống lại máy chủ từ xa, sử dụng chứng chỉ máy khách.
Máy chủ đang sử dụng chứng chỉ gốc tự ký và yêu cầu xuất trình chứng chỉ máy khách được bảo vệ bằng mật khẩu. Tôi đã thêm chứng chỉ gốc máy chủ và chứng chỉ máy khách vào kho khóa java mặc định mà tôi tìm thấy trong /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Tên của tệp kho khóa dường như gợi ý rằng chứng chỉ ứng dụng khách không được phép đi vào đó?
Dù sao, việc thêm chứng chỉ gốc vào cửa hàng này đã giải quyết được vấn đề khét tiếng javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Tuy nhiên, bây giờ tôi đang gặp khó khăn về cách sử dụng chứng chỉ ứng dụng khách. Tôi đã thử hai cách tiếp cận và không đưa tôi đến đâu.
Đầu tiên và ưu tiên, hãy thử:
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
Tôi đã thử bỏ qua lớp HttpsURLConnection (không lý tưởng vì tôi muốn nói chuyện HTTP với máy chủ) và thực hiện việc này thay thế:
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
Tôi thậm chí không chắc rằng chứng chỉ khách hàng là vấn đề ở đây.