trajber

programming…

Java + TLS

without comments

Encontrei alguns exemplos na internet que carregam o certificado da maneira mais simples: Passando o parametro para a JVM com o -Djavax.net.ssl.keyStore e -Djavax.net.ssl.keyStorePassword, para o servidor. E -Djavax.net.ssl.trustStore e -Djavax.net.ssl.trustStorePassword para o cliente. Porém em alguns casos é necessário carregar o arquivo de forma programática.
Resolvi escrever um exemplo bem básico (sem sockets NIO) que faz isso.

Um exemplo básico de um EchoClient/EchoServer suportando TLS.

Primeiro é necessário criar o certificado

keytool -genkey -keystore cert -keyalg RSA

Depois de informar senha, nome, nome da organização e todos os outros dados relevantes para o certificado um arquivo com o nome cert será criado no diretório corrente.

public class EchoClient {
    public static void main(String[] args) {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("/path/to/cert"), "mypassord".toCharArray());
 
            TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
            tmf.init(keyStore);
 
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, tmf.getTrustManagers(), new SecureRandom());
 
            SSLSocketFactory sslsocketfactory = context.getSocketFactory();
 
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);
 
            InputStream inputstream = System.in;
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
 
            OutputStream outputstream = sslsocket.getOutputStream();
            OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
            BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
 
            String string = null;
            while ((string = bufferedreader.readLine()) != null) {
                bufferedwriter.write(string + '\n');
                bufferedwriter.flush();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}
public class EchoServer {
    public static void main(String[] args) {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("/path/to/cert"), "mypassword".toCharArray());
 
            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
            kmf.init(keyStore, "mypassword".toCharArray());
 
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(kmf.getKeyManagers(), null, new SecureRandom());
 
            SSLServerSocketFactory sslserversocketfactory = context.getServerSocketFactory();
 
            SSLServerSocket sslserversocket =
                    (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
            SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
 
            InputStream inputstream = sslsocket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
 
            String string = null;
            while ((string = bufferedreader.readLine()) != null) {
                System.out.println(string);
                System.out.flush();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

Written by Mauro Trajber

November 14th, 2008 at 3:05 pm

Posted in Uncategorized

Leave a Reply

You must be logged in to post a comment.