web-dev-qa-db-fra.com

Connexion SSL Socket

Comment puis-je créer une connexion SSL Socket?

J'ai vraiment besoin de créer un magasin de clés? Ce fichier de clés doit être partagé avec toutes mes applications clientes?

J'ai créé un serveur avec le code suivant:

SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory
                    .getDefault();
SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
                    .createServerSocket(ServerProperties.getInstance()
                            .getVSSPAuthenticationPort());

J'ai créé un client sur Android avec le code suivant:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
                .getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
                Host, authPort);

sslsocket.startHandshake();

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                sslsocket.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(
                sslsocket.getInputStream()));

Mais lorsque j'essaie de me connecter, l'erreur suivante est générée:

javax.net.ssl.SSLHandshakeException: no cipher suites in common
    at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
    at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1886)
    at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:276)
    at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:266)
    at Sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.Java:894)
    at Sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.Java:622)
    at Sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.Java:167)
    at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:868)
    at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:804)
    at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:1016)
    at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1312)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1339)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1323)
18
Victor

Vous avez besoin d'un certificat pour établir une connexion SSL, vous pouvez charger le certificat dans un magasin de clés ou vous pouvez charger le certificat lui-même. Je vais montrer quelques exemples pour l'option keystore.

Votre code a besoin de quelques paramètres pour s'exécuter:

Java -Djavax.net.ssl.keyStore=keyStoreFile -Djavax.net.ssl.keyStorePassword=keystorePassword Server

Vous pouvez également charger le magasin de clés avec Java, la solution la plus simple pour cela est de définir les propriétés du système:

System.setProperty("javax.net.ssl.keyStore", 'keystoreFile');
System.setProperty("javax.net.ssl.keyStorePassword", 'keystorePassword ');

Vous pouvez également charger le magasin de clés d'une manière différente, c'est plus compliqué, mais vous avez la possibilité de faire des choses plus complexes:

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("keystoreFile"), "keystorePassword".toCharArray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(ks, "keystorePassword".toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); 
tmf.init(ks);

SSLContext sc = SSLContext.getInstance("TLS"); 
TrustManager[] trustManagers = tmf.getTrustManagers(); 
sc.init(kmf.getKeyManagers(), trustManagers, null); 

SSLServerSocketFactory ssf = sc.getServerSocketFactory(); 
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(serverport);
SSLSocket c = (SSLSocket) s.accept();

Pour les clients il y a quelques changements dans les dernières lignes du code, les 3 dernières lignes seront remplacées par celles-ci:

SSLSocketFactory ssf = sc.getSocketFactory(); 
SSLSocket s = (SSLSocket) ssf.createSocket(serverip, serverport);
s.startHandshake();

Si vous voulez charger un keystore pour Android le type devra être "BKS" et non "JKS". Vous pouvez trouver facilement des ressources pour créer un keystore.

30
VGe0rge