Я использую Java 6 и пытаюсь создать HttpsURLConnection
на удаленном сервере с использованием сертификата клиента.
Сервер использует собственный корневой сертификат и требует наличия защищенного паролем сертификата клиента. Я добавил корневой сертификат сервера и сертификат клиента в хранилище ключей java по умолчанию, которое я нашел в /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Имя файла хранилища ключей, похоже, предполагает, что сертификат клиента не должен туда заходить?Сертификаты клиента Java через HTTPS/SSL
Во всяком случае, добавив корневой сертификат в этот магазин решить пресловутый 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
Я даже не уверен, что проблема с клиентом - вот проблема.
У меня есть URL-адрес, например: https: // localhost: 8443/Application_Name/getAttributes. У меня есть метод с/getAttribute url mapping. Этот метод возвращает список элементов. Я использовал HttpsUrlConnection, код ответа на соединение - 200, но он не дает мне список атрибутов, когда я использую inputStream, он дает мне html-содержимое моей страницы входа. Я выполнил проверку подлинности и установил тип содержимого как JSON. Пожалуйста, предложите – Deepak