Java + TLS
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(); } } }
Leave a Reply
You must be logged in to post a comment.