2017-02-01 3 views
0

Я пытаюсь реализовать SSL-сокет между Android-приложением и API-интерфейсом Python.Сокеты SSL - Java и сертификаты?

Код ниже ...

SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
Socket s = ssf.createSocket("10.0.2.2", 5001); 
DataOutputStream myDataOut = new DataOutputStream(s.getOutputStream()); 
myDataOut.writeUTF("Hello Server"); 
myDataOut.flush(); 
myDataOut.close(); 
s.close(); 

не работает, как вы можете увидеть:

590.0750 - Establishing connection to ('127.0.0.1', 50888) 
590.0970 - Error while connecting 
590.0970 - Error information: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:590) 

Я считаю, что это не потому, что я не уточняя сертификат. См рабочий пример клиента Python:

import socket, ssl, pprint 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

ssl_sock = ssl.wrap_socket(s, 
          ca_certs="server.crt", 
          cert_reqs=ssl.CERT_REQUIRED) 

ssl_sock.connect(('localhost', 5001)) 

print repr(ssl_sock.getpeername()) 
print ssl_sock.cipher() 
print pprint.pformat(ssl_sock.getpeercert()) 

ssl_sock.write("Hello from the client...") 

Как я могу указать сертификат в Java, как я сделал в Python?

+0

Вы можете отлаживать проблемы ssl в Java с помощью параметра jvm * -Djavax.net.debug = ssl *. Таким образом, вы могли видеть, что действительно произошло между клиентом и сервером. В вашем случае, я думаю, ваша служба имеет сертификат для * localhost *, а в вашей java-программе вы используете ip. Если вы используете ip в java с сертификатом, будьте осторожны, поскольку вы должны использовать имя хоста как * CN *. Поместите IP-адрес в расширение ssl v3 как псевдонимы DNS. –

ответ

1

Взято, что я понял вас правильно, этот вопрос answer может быть интересен для вас. В нем описываются способы указания сертификатов.

Смежные вопросы