2016-08-31 4 views
0

Я пытаюсь подключиться к серверу ssl с помощью Java. Я уже успел это сделать в Python, однако у меня есть файл PEM, который не поддерживается Java. Преобразование его в PKCS12 не работаетОткрытие SSL-сокета с использованием сертификата pem

Ошибка при попытке подключения был:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Мой вопрос: Можете ли вы дать мне эквивалент Java? (Использование другой библиотеки также в порядке)

import ssl 
import socket 

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysslsock = ssl.wrap_socket(mysock, keyfile='mykey.pem', certfile='mycert.pem') 
mysslsock.connect(("SOMEHOST", XXXXX)) 

Обратите внимание, что сервер требует аутентификации клиента.

Редактировать

Вот что я сделал в Java:

я использовал OpenSSL конвертировать мой сертификат в формате PKCS12:

openssl pkcs12 -export -out mystore.p12 -inkey mykey.pem -in mycert.pem 

Тогда я использовал Keytool, который поставляется с JDK, чтобы преобразовать его в JKS:

keytool -importkeystore -destkeystore mystore.jks -srcstoretype PKCS12 -srckeystore mystore.p12 

И это мой Java-код:

System.setProperty("javax.net.ssl.keyStore", "mystore.jks"); 
System.setProperty("javax.net.ssl.keyStorePassword", "123456"); 
System.setProperty("javax.net.ssl.keyStoreType", "JKS"); 

SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
SSLSocket socket = (SSLSocket) socketFactory.createSocket(HOST, PORT); 
socket.startHandshake(); // That's the line I get the exception 
socket.close(); 

Я уверен, что я делаю некоторые действительно глупые ошибки, как у меня нет никакого опыта работы с SSL.

Edit: Вероятно, я так или иначе неправильные сертификаты, так это то, что они выглядят как:

<mykey.pem> 
-----BEGIN RSA PRIVATE KEY----- 
ljnoabndibnwzb12387uGJBEIUQWBIDAB 
....... (Some more lines) 
-----END RSA PRIVATE KEY----- 

<mycert.pem> 
Bag Attributes 
    localKeyId: XX XX XX XX 
subject:... 
issuer:... 
-----BEGIN CERTIFICATE----- 
LAinaw8921hnA....... 
..... 
-----END CERTIFICATE----- 
+1

Включите ваш код Java в вопрос pls. –

ответ

1

не нужно загрузить ключ в Java хранилище ключей?

Это отдельная программа.

http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html

-importcert {-alias псевдоним} {-file cert_file} [-keypass KeyPass] {-noprompt} {-trustcacerts} {-storetype storetype} {} -keystore хранилище ключей [-storepass Пароль к хранилищу ] {-providerName PROVIDER_NAME} {-providerClass provider_class_name {-providerArg provider_arg}} {} {-v -защищенного} {} -Jjavaoption

считывает сертификат или цепочку сертификатов (где последний поставляется в PKCS # 7 отформатированный ответ или последовательность сертификатов X.509) из файла cert_fi le и сохраняет его в записи хранилища ключей, идентифицируемой псевдонимом. Если файл не указан, сертификат или цепочка сертификатов считываются из stdin.

keytool может импортировать сертификаты X.509 v1, v2 и v3 и PKCS # 7 отформатированные цепи сертификатов, состоящие из сертификатов этого типа. Данные, подлежащие ввозу, должны быть предоставлены либо в формате двоичного кодирования, либо в формате для печати (также известный как кодирование Base64), как определено стандартом Internet RFC 1421 .В последнем случае кодирование должно быть ограничено в начале строкой, которая начинается с «----- BEGIN» и ограничена в концом строкой, начинающейся с «----- END».

+0

Будет ли это импортировать сертификат, которому доверяют все java-приложения? Это команда, я использую: "Keytool -importkeystore -destkeystore mystore.jks -srcstoretype PKCS12 -srckeystore mystore.p12" – torkleyy

+0

Спасибо, но какая из этих команд мне нужна? Извините, я не понимаю, в чем разница между всеми этими ключами ... – torkleyy