SSL (Secure Socket Layer)

SSL (Secure Sockets Layer) este un protocol dezvoltat de Netscape pentru transmiterea documentelor private prin Internet. SSL utilizeaza un sistem de criptare cu doua chei, una publica, cunoscuta de toata lumea si una privata, cunoscuta doar de beneficiarul mesajului (receptorul). Atât Netscape cât si Internet Explorer suporta protocolul SSL, iar o serie de site-uri îl utilizeaza pentru obtinerea informatiilor sensibile, cum ar fi numarul cartii de credit.

SSL ruleazã pe straturi, dedesubt ruleaza pe protocoale de aplicatie cum sunt HTTP, SMTP si NNTP si dedeasupra pe protocoale de transport cu e de exemplu TCP, care formeaza suita protocolului TCP IP. În timp ce el poate sã adauge protectia la oricare protocol care folosesc conexiuni de încredere(ca de exemplu TCP), el este cu mult mai comod folosit cu HTTP pentru a forma HTTPS. HTTPS este folosit la pagini World Wide Web sigure, pentru aplicatii ca de exemplu comertul electronic. El foloseste certificatele cu chei publice pentru a verifica identitatea de endpoints.

SSL este un protocol care lucreaza la nivelul aplicatie al modelului OSI, utilizat initial pentru a securiza comunicatia între doua aplicatii. Evolutia tehnologiei a adus în prim plan SSL, care securizeaza acum comunicatia între client si server pornind de la schimbul de certificate si schimbând chei de criptare. Protocolul SSL asigura ca interactiunea via https sa fie realizata fara brese de securitate. VPN via SSL a reprezentat de la început avantajul accesului fara un „client” preinstalat, lucru care nu se putea realiza cu IPSec.

Pasii care sunt urmati în procesul criptografic al implementarii SSL sunt:

  1. Se cripteaza codul cu cheia secreta a expeditorului
  2. Se cripteaza codul cu cheia publica a destinatarului
  3. Se genereaza certificate care transporta cheia publica folosita în criptografia asimetrica

Esenta procesului de comunicare prin SSL consta în stabilirea unor parametri criptografici înainte de transmiterea efectiva a datelor. Stabilirea parametrilor poarta numele de SSL handshake. În primul rând, clientul comunica serverului ce cipher suites are disponibile . Un cipher suite reprezinta o combinatie de parametri criptografici ce definesc algoritmul si cheile folosite pentru autentificare si criptare. Apoi, serverul se poate autentifica (acest pas este optional), permitându-i clientului sa fie sigur ca entitatea server este ceea cu care clientul se asteapta sa comunice. Pentru aceasta, serverul prezinta clientului un certificat ce contine cheia sa publica. Verificând acest certificat clientul poate fi sigur de identitatea serverului. Din acest moment, pot fi schimbate date între client si server.

JSSE este un pachet (integrat începând de la versiunea 1.4 în Java Standard Edition) ce ofera o serie de clase suport pentru dezvoltarea de aplicatii care sa comunice sigur peste un mediu nesigur. Acest pachet ofera în principal:

  • Un API pentru scrierea unor socketuri standard pentru SSL si TLS
  • Suport pentru asigurarea la nivelul transport a unor servicii de securitate – Autentificare, Integritate, Confidentialitate
  • Suport pentru combinatiile de cifrare standard
  • Suport pentru managementul protocolului https

Serviciul JSSE este reprezentat de următoarele clase de bază :

1. SocketFactory şi SSLSocketFactory

Creează diverse tipuri de socluri (sockets). Astfel, folosind mai multe tipuri de fabrici, aplicaţia poate crea şi folosi mai multe tipuri de socluri.

2. SSLSocket şi SSLServerSocket

Aceste clase extind javax.net.Socket. Obiectele de acest tip au acces la contextual în care au fost create, adică la SSLContext.

3. Interfaţa SSLSession

Reprezintă contextual negociat intre cele două parţi care comunică .

4. Clasa HttpsURLConection

HTTPS este un protocol similar cu HTTP. HTTPS, înainte de a începe comunicaţia, stabileşte un canal sigur intre server si client prin socluri SSL/TLS. Înainte de obţinerea unei conexiuni de tip HttpsURLConection, se pot configura parametrii de comunicaţie ai HTTP/HTTPS.

5. Clasa SSLContext

Un obiect de acest tip conţine informaţii despre toate soclurile create in respectivul context. Configurarea unui obiect de acest tip este realizată prin manageri de chei si manageri de încredere (key and trust managers). Aceşti manageri asigură suportul pentru autentificare şi pentru stabilirea de comun acord a cheilor, acestea fiind necesare în definirea cifrurilor (cipher suites) suportate de context.

6. Clasa TrustManager

Această clasă determină dacă autentificarea este reuşită sau nu. În caz că autentificarea nu reuşeşte, conexiunea va fi distrusă.

Exemplu

Pentru a crea un certificat putem sa utilizam programul keytool.exe care face parte din Java SDK. Utilitarul poate fi gasit in directorul $JAVA_HOME_DIR/bin. Comanda pentru a genera un certficat este:

keytool -genkey -keystore mySrvKeystore -keyalg RSA 

Programul va solicita informatii despre proprietarul certificatului precum si o parola. Introduceti parola 123456. Puteti sa folositi orice parola dar in acest caz trebuie modificat si codul programelor. Dupa generare, certificatul va fi salvat in directorul de lucru sub numele de mySrvKeystore. In continuare se prezinta codul unei simple aplicatii:

Echo server

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class EchoServerSSL {
    public static void main(String[] args) {
        try {
            		SSLServerSocketFactory sslserverfactory =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket)sslserverfactory.createServerSocket(9999);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream input = sslsocket.getInputStream();
InputStreamReader inputreader =new InputStreamReader(input);
BufferedReader br =new BufferedReader(inputreader);
String string = null;
while ((string = br.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
                      }catch (Exception e) {e.printStackTrace();}
    }
}

Echo client

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
public class EchoClientSSL {
    public static void main(String[] args) {
        try {	
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
OutputStream outputstream = sslsocket.getOutputStream();
OutputStreamWriter outputwriter =new OutputStreamWriter(outputstream);
BufferedWriter bw = new BufferedWriter(outputwriter);
String string = null;
while ((string = br.readLine()) != null) {
bw.write(string + '\n');
bw.flush();
}
        } catch (Exception e) {e.printStackTrace();}
    }
}

Pentru rularea aplicatiei client-server prezentata se vor realiza urmatorii pasi:

1. Certificatul creat cu utilitarul keytool.exe trebui copiat in directorul care contine fisierul bytecode pentru Server si acesta trebuie lansat folosind comanda:

java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456 EchoServerSSL

Daca au fost utilizate alte valori la crearea certificatului, comanda trebuie modificata corespunzator.

2. Copiati certificatul in directorul care contine fisierul class pentru Client si lansati comanda:

java -Djavax.net.ssl.trustStore=mySrvKeystore -Djavax.net.ssl.trustStorePassword=123456 EchoClientSSL