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