2016-11-08 3 views
0

J'ai créé un certificat auto-signé (server.crt, server.key, server.p12). Je reçois une connexion de socket SSL Python-Python en utilisant ce certificat auto-signé fonctionnant très bien.Création d'un socket SSL auto-signé du client Java (sur Android) vers le serveur Python

serveur Python:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(('', 10023)) 
s.listen(5) 
s_, fromaddr = s.accept() 
connstream = ssl.wrap_socket(s_, 
          server_side=True, 
          certfile="server.crt", 
          keyfile="server.key") 
data = connstream.read() 
... 

Maintenant, je voudrais que mon application Android pour parler avec mon serveur Python. Je peux obtenir une connexion non SSL. Je ne suis pas sûr de savoir comment procéder avec des certificats auto-signés. Ma compréhension est que je dois stocker le certificat dans le truststore de Java. J'ai de la difficulté à trouver des exemples de faire cela dans l'application Android (par programmation) en utilisant un fichier de certificat de confiance (par exemple le crt?). Évidemment, la portée de cette confiance est limitée à l'application seulement, et n'est pas destinée à être une solution permanente.

client Java (sur Android):

SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
Socket socket = ssf.createSocket(HOST, PORT); 
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println("hello from java!"); 
out.flush(); 
... 

Quand je tente de me connecter, je reçois l'erreur suivante sur le serveur:

ssl.SSLError: [Errno 1] _ssl.c:499: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown 

Répondre

0
  • export fichier crt au serveur
  • import fichier crt de asserts ou de fichiers au code Android
  • mis en place crt avec TrustManagerFactory a t code Android
  • init SSLContext avec TrustManagerFactory

cette référence est official document

+0

Cette réponse m'a été utile pour résoudre mon problème, mais non sans rechercher des informations supplémentaires ailleurs. La documentation officielle que vous avez liée explique '' '' TrustManagerFactory''' comme utilisé avec un '' '' 'HttpsURLConnection''', mais pas lorsqu'il est utilisé avec' '' 'Socket'''. Après plus de recherche, j'ai obtenu une connexion SSL en enveloppant un '' '' 'InetSocketAddress''' existant avec un' '' SSLContext''' après avoir utilisé '' 'getSocketFactory()' '', mais je ne suis pas sûr que ce soit la meilleure approche. Je pense que la réponse ci-dessus pourrait être améliorée avec un court exemple de '' '' SSLContext''' utilisé avec '' '' TrustManagerFactory'''. – SkyNT