2013-04-09 4 views
1

Я пытаюсь создать 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) для сервера.

+0

Я использую этот сайт в качестве эталона keytools команду для управления https://www.sslshopper.com/article-most-common- хранилище ключей Java-Keytool-хранилище ключей-commands.html. Вам нужно импортировать в новое хранилище ключей всю цепочку сертификатов и сертификат клиента. – BigMike

+0

Вы можете легко редактировать и конвертировать хранилища ключей с помощью программы Java GUI Portecle: http://portecle.sourceforge.net/ – Robert

+0

Да, я пробовал это, но я получаю сообщение об ошибке: Не удалось открыть ... p12 в качестве хранилища ключей (и пароль правильный). Итак, я преобразовал файлы в .cer-файлы (.p7b содержал 3 записи сертификата), и я создал новый файл хранилища ключей. Я импортировал все 4 файла в хранилище ключей (с пользовательскими псевдонимами) и сохранил его как mykeystore.jks. Я еще не пробовал. Я ищу java-решение для использования .jks, но честно ... «У меня нет идей, что я делаю ...» :) –

ответ

1

Попробуйте not-yet-commons-ssl.

Очень простая в использовании SSL-библиотека. Создание SSLClient и добавить Trust материалу

Пример из веб-страницы:

Client Example: 

SSLClient client = new SSLClient(); 

// Let's trust usual "cacerts" that come with Java. Plus, let's also trust a self-signed cert 
// we know of. We have some additional certs to trust inside a java keystore file. 
client.addTrustMaterial(TrustMaterial.DEFAULT); 
client.addTrustMaterial(new TrustMaterial("/path/to/self-signed.pem")); 
client.addTrustMaterial(new KeyMaterial("/path/to/keystore.jks", "changeit".toCharArray())); 

// To be different, let's allow for expired certificates (not recommended). 
client.setCheckHostname(true); // default setting is "true" for SSLClient 
client.setCheckExpiry(false); // default setting is "true" for SSLClient 
client.setCheckCRL(true);  // default setting is "true" for SSLClient 

// Let's load a client certificate (max: 1 per SSLClient instance). 
client.setKeyMaterial(new KeyMaterial("/path/to/client.pfx", "secret".toCharArray())); 
SSLSocket s = (SSLSocket) client.createSocket("www.cucbc.com", 443); 
+0

Я заметил файлы .pem, .jks, .pfx в вашем примере , Моя проблема в том, что я не могу туда добраться: т.е. создавая эти файлы из моих файлов .p12 и .p7b (я открыл это в Windows и содержал 3 записи сертификата). Итак, как мне добраться до формата, который мне нужен? –

+0

это ** должно ** работать с этими типами файлов.p12 точно, не так уверен с p7b, попробуйте. Также вы можете преобразовать .p7b в .cer с 'openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer', который затем будет работать с not-yet-commons-ssl. [Как конвертировать сертификаты] (http://myonlineusb.wordpress.com/2011/06/19/how-to-convert-certificates-between-pem-der-p7bpkcs7-pfxpkcs12/) – MaPePeR

+0

Я пробовал эту команду, и я получил сообщение об ошибке (невозможно загрузить объект PKCS7). Поэтому я использовал Windows для открытия этого файла, и я экспортировал эти 3 записи в part1.cer, part2.cer, part3.cer. Я также читал, что мне нужна целая цепочка ЦС, поэтому, вероятно, мне нужно использовать файл .p12 (который я также преобразовал в .cer) и эти 3 части .cer-файлов. У меня нет идей, как их использовать, чтобы получить файл .jks ... –