Я использую 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
Я даже не уверен, что проблема в сертификате клиента.
источник
Ответы:
Наконец решил это;). Есть сильный намек здесь (Gandalfs ответ коснулся немного на нем, а). Отсутствующие ссылки были (в основном) первым из параметров, приведенных ниже, и в некоторой степени я упустил из виду разницу между хранилищами ключей и надежными хранилищами.
Самозаверяющий сертификат сервера необходимо импортировать в хранилище доверенных сертификатов:
Эти свойства необходимо установить (либо в командной строке, либо в коде):
Рабочий пример кода:
источник
Хотя это не рекомендуется, вы также можете полностью отключить проверку сертификата SSL:
источник
Вы установили свойства KeyStore и / или TrustStore System?
или из с кодом
То же самое с javax.net.ssl.trustStore
источник
Если вы имеете дело с вызовом веб-службы с использованием платформы Axis, есть гораздо более простой ответ. Если все, что нужно вашему клиенту, - это иметь возможность вызывать веб-службу SSL и игнорировать ошибки сертификата SSL, просто введите этот оператор перед вызовом любых веб-служб:
System.setProperty("axis.socketSecureFactory", "org.apache.axis.components.net.SunFakeTrustSocketFactory");
Применяются обычные заявления об отказе от ответственности о том, что это очень плохо в производственной среде.
Я нашел это в вики Axis .
источник
Для меня это то, что сработало с использованием Apache HttpComponents ~ HttpClient 4.x:
Файл P12 содержит сертификат клиента и закрытый ключ клиента, созданный с помощью BouncyCastle:
источник
keyStore
то, что содержит закрытый ключ и сертификат.Я использую пакет HTTP-клиента Apache commons для этого в моем текущем проекте, и он отлично работает с SSL и самозаверяющим сертификатом (после его установки в cacerts, как вы упомянули). Пожалуйста, взгляните на это здесь:
http://hc.apache.org/httpclient-3.x/tutorial.html
http://hc.apache.org/httpclient-3.x/sslguide.html
источник
SSLContext
напрямую, поэтому вы можете настроить все это таким образом вместо использованияAuthSSLProtocolSocketFactory
.Я думаю, что у вас проблема с сертификатом сервера, это недействительный сертификат (я думаю, это то, что означает "handshake_failure" в данном случае):
Импортируйте сертификат сервера в хранилище ключей trustcacerts на клиентской JRE. Это легко сделать с помощью keytool :
источник
Используя нижеприведенный код
или
совсем не требуется. Также нет необходимости создавать собственную фабрику SSL.
Я также столкнулся с той же проблемой, в моем случае возникла проблема, связанная с полной цепочкой сертификатов не была импортирована в доверенные хранилища. Импортируйте сертификаты с помощью утилиты keytool справа от корневого сертификата, также вы можете открыть файл cacerts в блокноте и посмотреть, импортирована ли вся цепочка сертификатов или нет. Сверьтесь с псевдонимом, который вы указали при импорте сертификатов, откройте сертификаты и посмотрите, сколько в них содержится, такое же количество сертификатов должно быть в файле cacerts.
Также файл cacerts должен быть настроен на сервере, на котором вы запускаете свое приложение, два сервера будут аутентифицировать друг друга с помощью открытых / закрытых ключей.
источник