Comunicació SSL amb sòcols
Per tal que un socket es pugui comunicar amb el protocol segur SSL, cal crear objectes una mica diferents.
Al servidor:
ServerSocket serverSocket = new ServerSocket(PORT);
Es converteix en:
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket serverSocket = (SSLServerSocket) factory.createServerSocket(PORT);
Opcionalment, si volem autenticar al client (ho veurem més endavant):
serverSocket.setNeedClientAuth(true);
Al client:
Socket clientSocket = new Socket(HOST, PORT);
Es converteix en:
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket clientSocket = (SSLSocket) factory.createSocket(HOST, PORT);
A més, cal configurar les claus privada i pública correctament. I això depèn de si volem o no autoritzar la clau pública dels clients al servidor.
Tenim dos tipus de magatzems necessaris:
- Els keystores serveixen per identificar-nos
- Els truststores serveixen per autoritzar altres parts
La configuració es realitza mitjançant propietats de sistema a Java, amb aquesta instrucció:
System.setProperty("nomDeLaPropietat", "valor");
Sense autorització del client
Cal generar dos magatzems:
- serverKeystore.jks: clau pública/privada del servidor
- clientTruststore.jks: clau pública del servidor
keytool -genkey -alias srvAlias -keyalg RSA -keystore serverKeystore.jks -keysize 2048
keytool -export -keystore serverKeystore.jks -alias srvAlias -file server.crt
keytool -importcert -file server.crt -keystore clientTruststore.jks -alias srvAlias
Configuració al servidor per a identificar-se:
javax.net.ssl.keyStore=serverKeystore.jks
javax.net.ssl.keyStorePassword=yourpassword
Configuració al client per a acceptar al servidor (només si el servidor no està autoritzat per una CA Authority):
javax.net.ssl.trustStore=clientTrustore.jks
javax.net.ssl.trustStorePassword=yourpassword
Amb autorització del client
Als les configuracions anteriors, cal afegir:
- clientKeystore.jks: clau pública/privada del client
- serverTruststore.jks: clau pública del client
keytool -genkey -keyalg RSA -alias cltAlias -keystore clientKeystore.jks -keysize 2048
keytool -export -keystore clientKeystore.jks -alias cltAlias -file cliente.crt
keytool -importcert -file cliente.crt -keystore serverTruststore.jks -alias cltAlias
Configuració al servidor per a acceptar el client:
javax.net.ssl.trustStore=serverTruststore.jks
javax.net.ssl.trustStorePassword=yourpassword
Configuració al client per a identificar-se:
javax.net.ssl.keyStore=clientKeystore.jks
javax.net.ssl.keyStorePassword=yourpassword