Я пытаюсь создать SSL-соединение с сертификатами, загруженными из двух файлов (.p12 и .p7b).
Я попытался следующий код, чтобы загрузить файл P12-Как загрузить несколько файлов сертификатов в Java?
char []passwKey = "1234567".toCharArray();
KeyStore ts = KeyStore.getInstance("PKCS12");
ts.load(new FileInputStream("/home/user/Desktop/file.p12"), passwKey);
KeyManagerFactory tmf = KeyManagerFactory.getInstance("SunX509");
tmf.init(ts,passwKey);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(tmf.getKeyManagers(), null, null);
SSLSocketFactory factory =sslContext.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(factory);
SSLSocket socket = (SSLSocket) factory.createSocket("www.host.com", 8883); // Create the ServerSocket
String[] suites = socket.getSupportedCipherSuites();
socket.setEnabledCipherSuites(suites);
socket.startHandshake();
, но я получаю исключение:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Я считаю, что я должен создать файл .jks образуют .p12 и .P7B файлы (которые содержат целую цепочку ЦС), но я - это noob, и я не знаю, как это сделать. Примеры, которые я нашел, были основаны на одном файле/сертификате.
UPDATE:
Я использовал файлы сертификации для создания единого хранилища ключей (я считаю, что я нужен только файл .p12), но не повезло. Поэтому я напрямую обратился к сайту и экспортировал сертификат как .pem и добавил его в хранилище ключей. В моей отладочной информации, которую я теперь получаю «ServerHello», но в конце концов, я все еще получаю
handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Я попробовал несколько решений, напр. Java client certificates over HTTPS/SSL или Getting javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure Error с сертификатом из файла .p12 получил и один экспортируемые из браузера, но никто из них не работает ...
UPDATE 2:
Я попытался это: https://stackoverflow.com/a/11908693/1215791 и сумел получить к ServerHelloDone (и найденный доверенный сертификат ...).
Но то, что я пытаюсь сделать теперь войти в систему с запросом SOAP и я получаю это:
com.sun.xml.internal.messaging.saaj.soap.MessageImpl identifyContentType
SEVERE: SAAJ0537: Invalid Content-Type. Could be an error message instead of a SOAP message
Exception in thread "main" com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:text/html. Is this an error message instead of a SOAP response?
at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:148)
at SoapT.login(SoapT.java:241)
at SoapT.main(SoapT.java:75)
Я считаю, что это не проблема с приложенными сертификатами, но ошибка при создании мыльный запрос или ошибка (html) для сервера.
Я использую этот сайт в качестве эталона keytools команду для управления https://www.sslshopper.com/article-most-common- хранилище ключей Java-Keytool-хранилище ключей-commands.html. Вам нужно импортировать в новое хранилище ключей всю цепочку сертификатов и сертификат клиента. – BigMike
Вы можете легко редактировать и конвертировать хранилища ключей с помощью программы Java GUI Portecle: http://portecle.sourceforge.net/ – Robert
Да, я пробовал это, но я получаю сообщение об ошибке: Не удалось открыть ... p12 в качестве хранилища ключей (и пароль правильный). Итак, я преобразовал файлы в .cer-файлы (.p7b содержал 3 записи сертификата), и я создал новый файл хранилища ключей. Я импортировал все 4 файла в хранилище ключей (с пользовательскими псевдонимами) и сохранил его как mykeystore.jks. Я еще не пробовал. Я ищу java-решение для использования .jks, но честно ... «У меня нет идей, что я делаю ...» :) –