Conexión de socket SSL
¿Cómo puedo crear una conexión SSL Socket?
Realmente necesito crear un almacén de claves? Este keystore debe ser compartido con todas mis aplicaciones cliente?
- cómo resolver el error jsoup: no se puede encontrar una ruta de certificación válida a la dirección solicitada
- ¿Por qué algunas solicitudes HTTPS fallan al descifrar en Fiddler, mientras que algunas obras?
- Cómo administrar la conexión ssl cuando el servicio de red cambia
- Cordova App en Android usando SSL enviando multipart / form-data causes Error de la aplicación de rack: # <EOFError: cuerpo de contenido incorrecto>
- Android - Multiple onReceivedHttpAuthRequest con WebView
Tengo crear un servidor con el código siguiente:
SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory .getDefault(); SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory .createServerSocket(ServerProperties.getInstance() .getVSSPAuthenticationPort());
Tengo que crear un cliente en android con el siguiente código:
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()));
Pero cuando intento conectar, el error siguiente se lanza:
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)
- La conexión de twitter falló
- Convertir archivo JKS a BKS o crear archivo BKS
- HTTPS GET (SSL) con Android y certificado de servidor auto-firmado
- ¿Cómo puedo decir la versión TLS en Android Volley
- Error de SSL SSL HttpGet (sin certificado par) Error OR (Conexión cerrada por peer)
- HttpsUrlConnection: Ancla de confianza para ruta de certificación no encontrada en 2.3
- HttpsUrlConnection con proxy
- Cómo importar certificado SSL autofirmado a Volley en Android 4.1+
Necesita un certificado para establecer una conexión ssl, puede cargar el certificado dentro de un almacén de claves o puede cargar el certificado en sí. Mostraré algunos ejemplos para la opción keystore.
Su código necesita algunos parámetros para ejecutarse:
java -Djavax.net.ssl.keyStore=keyStoreFile -Djavax.net.ssl.keyStorePassword=keystorePassword Server
También puede cargar el almacén de claves con código java, la solución más simple para esto es establecer las propiedades del sistema:
System.setProperty("javax.net.ssl.keyStore", 'keystoreFile'); System.setProperty("javax.net.ssl.keyStorePassword", 'keystorePassword ');
También puede cargar el almacén de claves de una manera diferente, es más complicado pero tiene la capacidad de hacer cosas más complejas:
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();
Para los clientes hay algunos cambios en las últimas líneas del código, las 3 últimas líneas serán reemplazadas por éstas:
SSLSocketFactory ssf = sc.getSocketFactory(); SSLSocket s = (SSLSocket) ssf.createSocket(serverip, serverport); s.startHandshake();
Si desea cargar un almacén de claves para Android, el tipo tendrá que ser "BKS" y no "JKS". Puede encontrar fácilmente recursos para crear un almacén de claves.
- Android La intención pendiente iniciada desde notificaion no sustituye a la última
- Cómo reactivar una advertencia de Android Lint deshabilitada en el nivel de archivo