Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (twitter accountplv) Dernière mise à jour : 02 April 2013

Autorité de certification SSL et certificats HTTPS autosignés

Introduction

Nous supposons dans cette page que vous comprenez les mécanismes de https. Vous pouvez trouver ça dans le tutoriel : "Principes de HTTPS".

Ce tutoriel explique comment :

  • Créer sa propre authorité de certification
  • Créer des certificats https signés par cette autorité de certification
  • Configurer apache pour l'HTTPS
  • Importer le certificat de notre autorité de certification dans notre navigateur

Objectif :

Nous avons mis ce système en place pour sécuriser une communication entre une application mobile Android et une API Rest. On garantit ainsi que personne ne peut se mettre en man in the middle entre l'application et l'API.

Créer ma propre autorité de certification

Mettre en place l'environnement

# créer les répertoires
$ pwd
/tmp/tuto_ssl
$ mkdir CA
$ cd CA
$ mkdir newcerts private

# créer les fichiers où on enregistrera les certificats émis
$ echo '01' > serial
$ touch index.txt

Créer le fichier openssl.cnf

dir = .

[ req ]
default_bits        = 2048          # Size of keys
default_keyfile     = key.pem       # name of generated keys
default_md      = sha256            # message digest algorithm
string_mask     = nombstr       # permitted characters
distinguished_name  = req_distinguished_name
req_extensions      = v3_req

[ req_distinguished_name ]
# Variable name       Prompt string
#----------------------   ----------------------------------
0.organizationName  = Organization Name (company)
organizationalUnitName  = Organizational Unit Name (department, division)
emailAddress        = Email Address
emailAddress_max    = 40
localityName        = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName     = Country Name (2 letter code)
countryName_min     = 2
countryName_max     = 2
commonName      = Common Name (hostname, IP, or your name)
commonName_max      = 64

# Default values for the above, for consistency and less typing.
# Variable name           Value
#------------------------------   ------------------------------
0.organizationName_default  = Kitpages
localityName_default        = Grenoble
stateOrProvinceName_default = France
countryName_default     = FR

[ v3_ca ]
basicConstraints    = CA:TRUE
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer:always

[ v3_req ]
basicConstraints    = CA:FALSE
subjectKeyIdentifier    = hash

Créer le certificat racine

La commande suivante génère les 2 fichiers suivants :

  • une clé privée : private/cakey.pem
  • Un "root CA certificate" : cacert.pem
$ openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf
Generating a 2048 bit RSA private key
..............................+++
...................................+++
writing new private key to private/cakey.pem
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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.
-----
Organization Name (company) [Kitpages]:
Organizational Unit Name (department, division) []:
Email Address []:toto@hotmail.com
Locality Name (city, district) [France]:
State or Province Name (full name) [Grenoble]:
Country Name (2 letter code) [FR]:
Common Name (hostname, IP, or your name) []:My Company Root CA

Compléter le openssl.cnf

On peut maintenant ajouter les éléments suivants à la fin du fichier openssl.cnf

[ ca ]
default_ca		= CA_default

[ CA_default ]
serial			= $dir/serial
database		= $dir/index.txt
new_certs_dir		= $dir/newcerts
certificate		= $dir/cacert.pem
private_key		= $dir/private/cakey.pem
default_days		= 3650
default_md		= sha256
preserve		= no
email_in_dn		= no
nameopt			= default_ca
certopt			= default_ca
policy			= policy_match

[ policy_match ]
countryName		= match
stateOrProvinceName	= match
organizationName	= match
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

Générer un format PKCS#12 (.p12 ou .pfx)

le .p12 (ou PKCS#12) permet d'enregistrer dans 1 seul ficher la clé publique et la clé privée... J'avoue ne pas savoir exactement dans quels cas on se sert de ces fichiers... si vous avez des cas d'utilisation en tête, n'hésitez pas à les mettre en commentaire.

$ openssl pkcs12 -export -out cacert.pfx -inkey private/cakey.pem -in cacert.pem
Enter pass phrase for private/cakey.pem: demo #passwd déjà utilisé plus haut
Enter Export Password: #pass utilisé protéger le fichier pkcs#12
Verifying - Enter Export Password:

Créer des certificats de serveurs

Maintenant qu'on a notre autorité de certification, il faut créer les certificats pour des serveurs HTTPS.

Ca se passe en 2 étapes :

  • Créer une clé privée et une demande de signature de certificat (Certificate Signing Request ou CSR)
  • Signer le certificat avec l'autorité de certification

Créer la clé privée et la CSR (Certificate Signing Request)

génération des 2 fichiers :

  • key.pem : clé privée du serveur https
  • req.pem : demande de signature par l'autorité de certification
$ openssl req -new -nodes -out req.pem -config ./openssl.cnf
Generating a 2048 bit RSA private key
...................................+++
........+++
writing new private key to 'key.pem'
-----
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.
-----
Organization Name (company) [Kitpages]:
Organizational Unit Name (department, division) []:
Email Address []:toto@hotmail.com
Locality Name (city, district) [Grenoble]:
State or Province Name (full name) [France]:
Country Name (2 letter code) [FR]:
Common Name (hostname, IP, or your name) []:www.exemple.com

Signer le certificat

$ openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject s Distinguished Name is as follows
organizationName      :PRINTABLE:'Kitpages'
localityName          :PRINTABLE:'Grenoble'
stateOrProvinceName   :PRINTABLE:'France'
countryName           :PRINTABLE:'FR'
commonName            :PRINTABLE:'www.example.com'
Certificate is to be certified until Mar 20 15:20:01 2023 GMT (3650 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

Configurer Apache pour HTTPS

La façon de faire dépend de l'environnement. Je décris ici les étapes pour CentOS.

# installer le mod_ssl dans apache
yum install mod_ssl

# dans la conf apache (/etc/httpd/conf/httpd.conf), ajoutez
# un virtual host sur le port 443 
<VirtualHost 1.2.3.4:443>
    DocumentRoot /var/www/mon_site
    SSLEngine on
    SSLCertificateFile /home/webadmin/CA/cert.pem
    SSLCertificateKeyFile /home/webadmin/CA/key.pem
</VirtualHost>

Ajouter l'autorité de certification dans son navigateur

Ajout d'un certificat dans firefox

Pour ne pas avoir d'alerte de sécurité, il faut ajouter notre autorité de certification dans notre navigateur.

Je montre la procédure avec Firefox.

Aller dans :

  • Options
  • Avancé
  • Chiffrement
  • Afficher les certificats
  • Autorités
  • Importer

Allez chercher le fichier cacert.pem et importez le dans les certificats racine de votre navigateur.

Pour aller plus loin

Ce tutoriel est une compilation de pas mal d'infos trouvées sur Internet et pas mal de tests. La première source d'information étant la documentation suivante (datant de 1996) :

http://www.eclectica.ca/howto/ssl-cert-howto.php

Pourquoi tout ça ?

Pourquoi rentrer dans toute cette complexité alors qu'en une commande on peut créer un certificat autosigné ?

Parce que dans le cas par exemple d'une application mobile, ça permet d'embarquer le certificat racine dans son appli et de sécuriser complètement la communication. Alors qu'avec un certificat autosigné, on n'aurait pas pu garantir l'absence d'un équipement en "man in the middle".

L'autre intérêt est de comprendre un peu mieux comment fonctionne https.

N'hésitez pas à me faire des remarques / ajouts / corrections en commentaire.

Commentaires

Note : on ne peut plus ajouter de commentaire sur ce site
fichier p12
Le fichier p12 est utile pour accéder à un serveur VPN comme strongswan à partir d'un poste windows 7.
Merci
Grâce à toi j'ai pu mieux comprendre le SSL et réussi à mettre en place mes serveurs sécurisés et les rendre accessible depuis android. Il ne m'a manqué que la commande pour convertir le cacert.pem en un format utilisable par android (http://www.jethrocarr.com/2012/01/04/custom-ca-certificates-and-android/).

Merci