Я використовую Java 6 і намагаюся створити HttpsURLConnection
проти віддаленого сервера, використовуючи сертифікат клієнта.
Сервер використовує самопідписаний кореневий сертифікат і вимагає представити захищений паролем сертифікат клієнта. Я додав кореневий сертифікат сервера та клієнтський сертифікат до зберігання ключів Java за замовчуванням, у якому я знайшов /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Ім'я файлу зберігання ключів, здається, говорить про те, що клієнтський сертифікат не повинен туди входити?
Як би там не було, додавання кореневого сертифіката в цей магазин вирішило сумнозвісний характер 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
Я навіть не впевнений, що тут проблема в сертифікаті клієнта.