Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
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
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) :
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
Ajouter un commentaire