This is an old revision of the document!
TLS (Transport Layer Security) reprezintă modul în care un canal TCP nesigur este securizat. TLS asigură un canal sigur (criptat) de comunicare între client și server. În general serverul își validează identitatea folosind un certificat care apoi este folosit și pentru stabilirea cheilor de criptare ale conexiunii.
Un certificat cuprinde o cheie publică, datele de identificare ale serverului și o semnătură care să garanteze asocierea între acea identitate și cheia publică aferentă.
Un certificat este valid dacă este semnat de o autoritate de certificare (CA: Certificate Authority). Această entitate este considerată de încredere de clientul comunicației, iar clientul are acces la certificatul acestei autorități. Cu certificatul acestei autorități, clientul poate verifica semnătura certificatului serverului și, astfel, să se asigure de identitatea serverului.
În arhiva de sarcini a laboratorului există un certificat în fișierul houdini.cs.pub.ro.crt-roedunet
.
Vrem să afișăm informații despre acest fișier: identificator, semnatar, data expirări, cheia publică. Pentru aceasta folosim comanda
openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -text
Parcurgeți output-ul comenzii și aflați informații despre certificat precum:
Putem afișa informații punctuale despre certificat solicitând infomații punctuale (doar anumite câmpuri) folosind comanda openssl
cu opțiunile aferente:
openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -pubkey openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -startdate openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -enddate openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -dates openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -issuer openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -subject openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -modulus
Vrem să verificăm faptul că un certificat este semnat valid și că avem acces corect la certificatul CA-ului (sau lanțul de certificate ale CA-ului – certificate chain). De obicei, serverul este configurat să trimită certificatele intermediare clientului pentru ca acesta să poată avea acces la întreg lanțul de certificate.
Verificăm certificatul de mai sus folosind comanda
openssl verify -CAfile ../../terena-ca-chain-2.pem security.cs.pub.ro.crt-roedunet
Certificatul apare expirat, dar din punctul de vedere al semnării este valid.
Pentru certificatele open-source.cs.pub.ro.crt-roedunet
și security.cs.pub.ro.crt-roedunet
verificați care este certificate chain-ul aferent cu care au fost generate. Adica vedeți care dintre cele două fișiere de tip chain (terena-ca-chain.pem
și terena-ca-chain-2.pem
sunt cele corespunzătoare.
Urmăriți ce conțin fișierele de tip chain folosind comanda cat
.
Pentru a face dump la informațiile dintr-un fișier de tip bundle (cum sunt terena-ca-chain.pem
și terene-ca-chain-2.pem
) nu avem suport implicit în openssl
. Putem însă folosi comanda keytool
din suita Java, așa cum este indicat aici. Folosiți keytool
pentru a afișa informații despre certificatele de tip bundle.
Pentru a testa conectarea sigură la un server și interogarea acestuia (similar comenzii netcat
), vom folosi comanda openssl s_client
care realizează un tunel sigur TLS.
Astfel, pentru a ne conecta la Google în modul simplu, vom folosi comanda
nc google.com 80 GET / HTTP/1.0 HTTP/1.0 302 Found Location: http://www.google.ro/?gws_rd=cr&ei=i2qOVpSiAuLnyQPYkaO4AQ Cache-Control: private [...]
în vreme ce pentru a ne conecta în mod sigur folosim comanda
openssl s_client -connect google.com:443 CONNECTED(00000003) depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority verify return:1 depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA verify return:1 depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2 verify return:1 depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com verify return:1 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com i:/C=US/O=Google Inc/CN=Google Internet Authority G2 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority --- Server certificate -----BEGIN CERTIFICATE----- MIIHqTCCBpGgAwIBAgIILjRo+RchlW0wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE [...] --- GET / HTTP/1.0 HTTP/1.0 302 Found Location: https://www.google.ro/?gws_rd=cr&ei=pWqOVq7vEcO8ygOarIi4DQ Cache-Control: private [...]
Observăm că în cazul conexiunii sigure, am primit și informații despre certificatul google.com
, conexiunea este acum sigură, dar rezultatul este același (am obținut aceeași pagină).
Pentru a valida siguranța conexiunii putem, într-o consolă distinctă, să capturăm traficul folosind tcpdump
cu ajutorul comenzii de mai jos:
sudo tcpdump -i eth0 -n -A host google.com and tcp port 80 or tcp port 443
Dacă reluăm comenzile de mai sus vom vedea că putem vizualiza cererea și răspunsul HTTP pentru conexiunea plain text (folosind netcat
) dar nu și pentru cererea și răspunsul HTTPS pentru conexiunea sigură.
Puteți valida faptul că o conexiune este sigură sau nu și prin folosirea comenzii wget
:
wget http://google.com wgets http://google.com
Folosiți openssl s_client
pentru a obține pagina acestui laborator, adică folosiți URL-ul http://ocw.cs.pub.ro/courses/gsr/laboratoare/laborator-10. Observați că:
Conectarea cu openssl s_client și obținut certificate chain-ul de la distanță și validat că e în regulă
Crearea unei chei și a unui CSR; semnarea certificatului folosind “CA”-ul din sala de laborator (vom avea un certificat self-signed), obținerea CRT-ului.
Verificarea că CRT-ul corespunde cheii, investigarea sa.
Verificarea CRT-ului și cheii, validat că sunt corespunzătoare, pentru primul certificat investigat (la exercițiul de mai sus).
Configurare suport HTTPS pentru serverul web, pentru hostname-ul aferent în Apache cu certificatul generat și semnat la pasul anterior
Instalarea și configurarea IMAPS cu certificatul generat și semnat la pasul anterior