2017-02-01 51 views
0

我試圖在Android應用程序和Python API之間實現SSL套接字。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

您可以使用jvm參數* -Djavax.net.debug = ssl *來調試Java中的ssl問題。所以你可以看到客戶端和服務器之間發生了什麼。在你的情況下,我認爲你的服務器擁有* localhost *的證書,並且在你的java程序中使用了ip。如果您在帶證書的java中使用ip,請務必小心,因爲您必須將主機名稱用作* CN *。將IP地址作爲DNS別名放入ssl v3擴展名中。 –

回答

1

因爲我理解你對,這個answer到一個相關的問題可能會對你有意思。它描述了指定認證的方式。