Vous êtes sur la page 1sur 19

SSL sous Linux

LASFAR Salim
Transport Layer Security (TLS), et son
prdcesseur Secure Sockets Layer (SSL), sont
des protocoles de scurisation des changes sur Internet,
dvelopp l'origine par Netscape (SSL version 2 et SSL
version 3).

LP-R2SI:
Administration des
rseaux et scurit
sous Linux.

Encadr Par : Mr M.EL KIRAM

Gestion des Certificats avec OpenSSL


SOUS UBUNTU Server LTS

Introduction:
Transport Layer Security (TLS), et son prdcesseur Secure Sockets Layer (SSL),
sont des protocoles de scurisation des changes sur Internet, dvelopp
l'origine par Netscape (SSL version 2 et SSL version 3). Il a t renomm en
Transport Layer Security (TLS) par l'IETF suite au rachat du brevet de Netscape
par l'IETF en 2001. Le groupe de travail correspondant l'IETF a permis la
cration des RFC 2246 pour le TLS et RFC 4347 pour son quivalent en mode
datagramme, le DTLS. Depuis son rapatriement par l'IETF, le protocole TLS a
vcu deux rvisions subsquentes : TLSv1.1 dcrite dans la RFC 4346 et publie
en 2006 et TLSv1.2, dcrite par la RFC 5246 et publie en 2008.
Il y a trs peu de diffrences entre SSL version 3 et TLS version 1 (qui
correspond la version 3.1 du mcanisme SSL) rendant les deux protocoles non
interoprables. TLS a tout de mme mis en place un mcanisme de compatibilit
ascendante avec SSL. En outre, TLS diffre de SSL pour la gnration des cls
symtriques. Cette gnration est plus scurise dans TLS que dans SSLv3 dans
la mesure o aucune tape de l'algorithme ne repose uniquement sur MD5 pour
lequel sont apparues des faiblesses en cryptanalyse.
Par abus de langage, on parle de SSL pour dsigner indiffremment SSL ou TLS.
TLS fonctionne suivant un mode client-serveur. Il fournit les objectifs de
scurit suivants :

l'authentification du serveur ;
la confidentialit des donnes changes (ou session chiffre) ;
l'intgrit des donnes changes ;
de manire optionnelle, l'authentification ou l'authentification forte du client
avec l'utilisation d'un certificat numrique ;
la spontanit, c'est--dire qu'un client peut se connecter de faon
transparente un serveur auquel il se connecte pour la premire fois ;
la transparence, qui a contribu certainement sa popularit : les protocoles
de la couche d'application n'ont pas tre modifis pour utiliser une
connexion scurise par TLS. Par exemple, le protocole HTTP est identique,
que l'on se connecte un schme http ou https.

Atelier :
Cet atelier est un extrait du document technique : Installation, configuration et
test de OpenSSL, ralis par Marchiani Jean-Baptise de lIUP STRI
N.B-1: Les commandes taper la console sont en gras et prcdes du caractre
# . Les messages renvoys par la console sont en gras et italiques.
N.B-2: Ils est IMPORTANT de noter que les commandes prsentes dans ce
dossier tiennent compte d'un choix d'arborescence / architecture.
Si une modification par rapport ce prsent document est apporte, il faudra
que tous les fichiers de configuration ainsi que les commandes soient modifis
afin de supporter ces modifications.

I CONFIGURATION DE OPENSSL :
Pour plus de cohrence (ref livre "PKI Open Source") nous allons crer
Diffrents rpertoires et fichiers et modifier le fichier de configuration de
OpenSSL dans l'optique des futures manipulations.
Cration des fichiers ncessaires OpenSSL
#cd /etc/ssl
#mkdir crl
#mkdir certs //(si inexistant)
#mkdir ca
#mkdir csr
#mkdir newcerts
#mkdir cnf
#mkdir private //(si inexistant)
#chmod 700 private
#echo "01" > serial
#cp /dev/null index.txt

Description des lments:


le rpertoire crl contiendra les listes de rvocation;

le rpertoire certs contiendra les certificats signs;


le fichier ca contiendra la paire de cls et le certificat de l'autorit de
certification;
le rpertoire csr contiendra les requtes de certificats;
le rpertoire newcerts contiendra les certificats signs grs par OpenSSL;
le rpertoire cnf contiendra les fichiers de configuration autres que
openssl.cnf;
le rpertoire private contiendra les paires de cls publiques/prives;
le fichier serial contiendra le numro de srie du prochain certificat signer;
le fichier index.txt contiendra la base de donnes de l'autorit de
certification gre par OpenSSL;
Cration du fichier alatoire
Lors de la gnration de paire de cls, OpenSSL a besoin d'un fichier alatoire
afin d'alimenter son gnrateur de nombres pseudo-alatoires.
Cration du fichier alatoire .rand
#cd /etc/ssl
# dd if=/dev/urandom of=private/.rand bs=1k count=16

16+0 enregistrements lus.


16+0 enregistrements crits.
16384 bytes transferred in 0,026151 seconds (626513 bytes/sec)
Explication :
La valeur count=16 donne un fichier .rand de 16x1k (countxbs), soit 16 ko.
Nous pouvons maintenant modifier le fichier de configuration de OpenSSL pour
plus de comprhension et de cohrence.
Modification du fichier de configuration de OpenSSL

Editer dans /etc/ssl le fichier openssl.cnf.


Nous allons modifier les champs:

./demoCA par /etc/ssl


cacert.pem par ca/ca.crt
crl.pem par ca/ca.crl
cakey.pem par ca/ca.key

de faon obtenir:

Les caractres en gras ci dessus correspondent aux modifications apportes.


Cration des fichiers de configuration pour la cration des certificats
a) Fichier de configuration de Root CA

Dans /etc/ssl crer un nouveau fichier root-ca-cert.cnf:


#cd /etc/ssl/cnf
#touch root-ca-cert.cnf

L'diter afin de lui intgrer le texte de l'annexe 1.


Ce fichier servira la cration du certificat de l'autorit de certification.
b) Fichier de configuration des serveurs

On entend ici par serveurs les serveurs de type web par exemple c'est dire
proposant des services qui requirent l'utilisation de certificat ou encore des
serveurs d'authentification tel que le serveur Radius utilisant le protocole
EAPTLS reposant lui aussi sur l'utilisation de certificats.
De la mme faon que prcdemment:
#cd /etc/ssl/cnf
#touch req-server-cert.cnf

L'diter afin de lui intgrer le texte de l'annexe 2.


Ce fichier servira la cration du certificat du serveur (web par exemple).
Puis:
#touch ca-server-cert.cnf

Ce fichier permettra la signature du certificat par l'autorit de certification


(Root CA).
L'diter afin de lui intgrer le texte de l'annexe 3.
c) Fichier de configuration des utilisateurs

Comme dans le paragraphe prcdent et toujours dans /etc/ssl/cnf:


#touch req-user-cert.cnf

L'diter afin de lui intgrer le texte de l'annexe 4.


#touch ca-user-cert.cnf

L'diter afin de lui intgrer le texte de l'annexe 5.

II CREATION DES CERTIFICATS


1. Certificat Root CA
a) Gnration d'une paire de cls

Tout d'abord, il faut gnrer la paire de cls prive / publique RSA avec la
commande genrsa. Le paramtre -des3 indique que la paire de cls sera chiffre
avec l'algorithme
DES3. Le paramtre -out prcise le nom du fichier de la paire de cls. Le
paramtre - rand pointe sur un fichier alatoire. Le dernier paramtre doit tre la
longueur de la paire de cls en nombre de bits.
Se placer dans /etc/ssl/bin afin de pouvoir lancer l'excutable ./openssl :
#cd /etc/ssl/bin

Le mot de passe qui a t choisi est: rootca


# ./openssl genrsa -des3 -out ./ca/ca.key -rand ./private/.rand 4096

16384 semi-random bytes loaded


Generating RSA private key, 4096 bit long modulus
..................................................................
................++
..................................................................
..................................................................
..................................................................
.....................++
e is 65537 (0x10001)
Enter pass phrase for ./ca/ca.key:Root CA
Verifying - Enter pass phrase for ./ca/ca.key:Root CA

Il est conseill de mettre les droits de ca.key 400 n'autorisant ainsi que la
lecture de cette paire de cls, et uniquement par l'administrateur root.
Se situant dans /etc/ssl/bin et devant modifier les droits de ca.key se trouvant
dans /etc/ssl/private nous utilisons ici ./ pour revenir en arrire soit /etc/ssl/ .
#chmod 400 ./ca/ca.key
b) Gnration et signature du certificat Root CA

Ensuite il faut gnrer et signer le certificat Root CA avec la commande req. Le


paramtre new combin avec -x509 signifie qu'un certificat X.509 autosign va
tre gnr (et non une requte). Le paramtre days indique le nombre de jours

de validit du certificat. Le paramtre config prcise le nom du fichier de


configuration utiliser, le paramtre key pointe sur la paire de cls RSA
prcdement gnre. Enfin, le paramtre out prcise le nom du fichier
certificat :
#./openssl req -new -x509 -days 124 -config ./cnf/root-cacert.cnf -key ./ca/ca.key
-out ./ca/ca.crt

Enter pass phrase for ./ca/ca.key:Root CA


You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name
or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
----Country Name * (2 letter code) [FR]:FR
State or Province Name * (full name) [Province]:France
Locality Name * (eg, city) [City]:Toulouse
Organization Name * (eg, company) [Company]:IUT
Organizational Unit Name (eg, section) []:CRI
Common Name * (eg, Root CA name) []:Root_CA_Name

Pour afficher le certificat :


# openssl x509 -in ./ca/ca.crt -text noout

2. Certificat Serveur
a) Gnration d'une paire de cls

De la mme faon que pour le certificat Root CA, on gnre une paire de cls
prive/publique. Le mot de passe qui a t choisi est: Serveur SSL. De plus, afin
d'organiser de faon concise l'arborescence, il semble tre judicieux de crer un
dossier qui portera le nom du serveur pour lequel on veut crer le certificat
serveur (ici serveurssl) :
#cd /etc/ssl
#mkdir serverssl
#cd /etc/ssl/bin
#./openssl genrsa -des3 -out ./serverssl/serverssl.key -rand ./private/.rand 1024

16384 semi-random bytes loaded


Generating RSA private key, 1024 bit long modulus
...........................................++++++
.......++++++
e is 65537 (0x10001)

Enter pass phrase for ./serverssl/serverssl.key:Serveur SSL


Verifying - Enter pass phrase for ./
serverssl/serverssl.key:Serveur SSL
#chmod 400 ./serverssl/serverssl.key

Cela se passe maintenant en 2 temps. Tout d'abord, il y a gnration d'une


requte de certificat puis la signature peut s'effectuer.
b) Gnration d'une requte de certificat Serveur
On effectue une requte de certificat serveur avec la commande req. Le paramtre -new
permet de gnrer une nouvelle requte. Et, le paramtre config prcise le nom du
fichier de configuration utiliser. Le paramtre key pointe sur la paire de cls RSA
prcdemment gnre. Le paramtre out prcise le nom du fichier de la requte
(PKCS#10) :
#./openssl req -new -config ./cnf/req-server-cert.cnf -key ./serverssl/serverssl.key
-out ./serverssl/serverssl.csr

Enter pass phrase for ./serverssl/serverssl.key:Serveur SSL


You are about to be asked to enter information that will be incorporated into your
certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
----Country Name * (2 letter code) [FR]:
State or Province Name (full name) [Province]:France
Locality Name (eg, city) [City]:Toulouse
Organization Name * (eg, company) [Company]:IUT
Organizational Unit Name (eg, section) [Section]:CRI
Common Name * (eg, www.domain.com) []:common-name
E-mail Address []:root@debian
c) Signature par le certificat Root CA

Puis il faut signer la requte de certificat Serveur avec la commande ca. Le


paramtre -config prcise le nom du fichier de configuration utiliser. Le

paramtre days indique le nombre de jours de validit du certificat. Le


paramtre in pointe sur la requte prcdemment gnre. Le paramtre out
prcise le nom du fichier qui contiendra le certificat sign. De plus, le paramtre
notext fait en sorte que le fichier dsign par le paramtre out ne contienne
pas de version texte du certificat: ce fichier ne contiendra que le certificat au
format PEM (Base64) :
# ./openssl ca -config ./cnf/ca-server-cert.cnf -days 730 in
./serverssl/serverssl.csr -out ./serverssl/serverssl.crt notext

Using configuration from ./cnf/ca-server-cert.cnf


Enter pass phrase for /etc/ssl/ca/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'FR'
stateOrProvinceName :PRINTABLE:'France'
localityName :PRINTABLE:'Toulouse'
organizationName :PRINTABLE:'IUT'
organizationalUnitName:PRINTABLE:'CRI'
commonName :PRINTABLE:'common-name'
emailAddress :IA5STRING:'root@debian'
Certificate is to be certified until Jan 13 17:25:23 2007 GMT (730
days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated.
3. Certificat Utilisateur
a) Gnration d'une paire de cls prive / publique

De la mme faon que pour le serveur ou l'autorit de certification, il est


ncessaire de gnrer la paire de cls. Le mot de passe choisi ici pour la paire de
cls est : march.
Pour cela:

#./openssl genrsa -des3 -out ./private.march.key-rand ./ private/.rand 1024

16384 semi-random bytes loaded


Generating RSA private key, 1024 bit long modulus
.++++++
.............................................++++++
e is 65537 (0x10001)
Enter pass phrase for private.march.key:march
Verifying - Enter pass phrase for private.march.key:march
b) Gnration d'une requte de certificat Utilisateur

Nous allons maintenant gnrer la requte de certificat Utilisateur :


#./openssl req -new -config ./cnf/req-user-cert.cnf -key private.march.key -out
./csr/march.csr

Enter pass phrase for private.march.key:march


You are about to be asked to enter information that will be Incorporated into your
certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
----Country Name (2 letter code) []:FR
State or Province Name (full name) []:France
Locality Name (eg, city) []:Toulouse
Organization Name (eg, company) []:IUT
Organizational Unit Name (eg, section) []:CRI
Common Name * (eg, your name) []:march Jean-Baptiste
E-Mail Address * []:march_jb@yahoo.fr

c) Signature d'un certificat Utilisateur

Nous allons maintenant faire signer le certificat par le Root CA:


#./openssl ca -config ./cnf/ca-user-cert.cnf -days 124 -in ./csr/march.csr -out
./certs/march.crt notext

Using configuration from ./cnf/ca-user-cert.cnf


Enter pass phrase for /etc/ssl/ca/ca.key:
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:FR
stateOrProvinceName :PRINTABLE:France
localityName :PRINTABLE:Toulouse
organizationName :PRINTABLE:IUT
organizationalUnitName:PRINTABLE:CRI
commonName :PRINTABLE:march Jean-Baptiste
emailAddress :IA5STRING:march_jb@yahoo.fr
Certificate is to be certified until May 18 11:34:46 2005 GMT (124 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write ou database with 1 new entries Data Base Updated
d) Conversion d'un certificat utilisateur

Lorsque la paire de cls et le certificat sont gnrs par la PKI, il est trs
pratique de retourner toutes ces donnes l'utilisateur au moyen du format
PKCS#12, car ce dernier est reconnu par de trs nombreux clients web et de
messagerie.
La commande ci-dessous fait la conversion du certificat au format p12 :
#./openssl pkcs12 -export -descert -inkey private.march.key -in
./certs/march.crt -name "march_friendlyname" -certfile ./
ca/ca.crt -caname "rootca_friendly_name" -out ./certs/march.p12

Enter pass phrase for private.march.key:march


Enter Export Password:marchexport
Verifying - Enter Export Password:marchexport

III Simulation: phase de test d'change de certificat


NB : On fait un test local sur deux terminaux TTY1 = serveur et TTY2 = client
Mais vous pouvez faire le test sur deux machines diffrentes mais on doit
changer ladresse 127.0.0.1 par ladresse du serveur au cot client.
Simulation d'un serveur SSL/TLS
#./openssl s_server -accept 4433 -no_ssl2 -no_dhe -cert ./serverssl/serverssl.crt key ./serverssl/serverssl.key -CAfile ./ca/ca.crt -msg -WWW -Verify 1

verify depth is 1, must return a certificate


Enter PEM pass phrase:Serveur SSL

Simulation d'un client SSL/TLS


#./openssl s_client -connect 127.0.0.1:4433 -msg -cert ./certs/march.crt -key
private.march.key

Enter PEM pass phrase:march


Rsultat :

Aprs si on retourne au cot serveur on va trouver :

Les captures sont dcrites en bas


Cot Serveur :
On passe le rsultat qui sera afficher travers le pipe la commande tee qui va
lenregistrer dans un fichier qui sera cre aussi par la commande tee | tee
nom_fichier

Cot Client :
On passe le rsultat qui sera afficher travers le pipe la commande tee qui va
lenregistrer dans un fichier qui sera cre aussi par la commande tee | tee
nom_fichier

Rsultat :

Aprs on affiche le rsultat affich dans terminal avec une faon vite sur
Client on va le trouv dans le fichier MonTestCoteClient

Cot Serveur :
Aprs on affiche le rsultat affich dans terminal avec une faon vite sur
Serveur on va le trouv dans le fichier MonTestCoteServeur