Généralités
Utilisé principalement pour identifier et authentifier une personne physique ou morale, mais aussi pour chiffrer des échanges.
Le certificat est une clé publique signée par une CA (Autorité de certification) qui certifie que la clé publique est bien celle de l'entreprise E.
Tuto
Formats
PEM (X509 base64)
Extensions .pem, .crt, .cer, .key
Fichier ASCII encodé en Base64.
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN PRIVATE KEY----- -----END PRIVATE KEY-----
Il peut contenir le certificat et la clé privée.
Habituellement la clé privée est dans un fichier séparé PrivateKey.key
DER
Équivalent au PEM mais au format binaire.
Extension .pfx, .p12
Fichier binaire chiffré. Utilisé sur Windows pour l'import et l'export des certificats.
Possibilité de convertir MonCertificat.p12 → MonCertificat.cer, puis de diviser se dernier en CACertificat.cer et PrivateKey.key
|
certbot certonly --email admin@domain.fr --webroot --webroot-path /usr/share/webapps/monsite --domains www.domain.fr --agree-tos --rsa-key-size 4096
mkdir -p /var/lib/letsencrypt/.well-known
chgrp http /var/lib/letsencrypt
chmod g+s /var/lib/letsencrypt
certbot certonly --email moi@domain.fr --manual --domains www.domain.fr --agree-tos --rsa-key-size 4096
cd /usr/share/webapp/monsite
mkdir -p .well-known/acme-challenge
printf "%s" xxx.yyy > .well-known/acme-challenge/xxx
rm -r .well-known/acme-challenge
openssl x509 -text -noout -in /etc/letsencrypt/live/domain.fr/cert.pem
|
4 fichiers sont créés dans /etc/letsencrypt/live/www.domain.fr
cert.pem |
|
chain.pem |
|
fullchain.pem |
certificat et chain
|
privkey.pem |
clé
|
1 fichier est créé dans /etc/letsencrypt/csr
/etc/nginx/nginx.conf
|
server {
listen 80;
server_name monsite.domain.fr;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/letsencrypt/live/www.domain.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain.fr/privkey.pem;
include letsencrypt.conf;
|
/etc/nginx/letsencrypt.conf
|
location ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
|
 |
Les certificats Let's Encrypt ont une durée de validité de 90 jours.
La commande renew les renouvelle s'ils expirent dans moins de 30 jours. |
 |
When run with a set of domains corresponding to an existing certificate, the certonly command attempts to renew that specific certificate. (Renewing certificates) |
 |
Une fois le certificat renouvelé, redémarrer le serveur web. |
Cron
crontab
|
1 0 * * * /path/scripts/renew-certificates.sh
|
renew-certificates.sh
|
#!/bin/bash
set -u
set -e
set -o pipefail
/usr/local/bin/certbot certonly \
--dns-ovh \
--dns-ovh-credentials /root/.ovh-api.ini \
--non-interactive \
--agree-tos \
--email admin@domain.fr \
--domains 'domain.fr,*.domain.fr'
|
 |
Any executable files found in /etc/letsencrypt/renewal-hooks/deploy will be run only after a successful renewal. |
/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
|
#!/bin/bash
set -e
set -o pipefail
set -u
systemctl reload nginx
|
/etc/letsencrypt/renewal-hooks/deploy/restart-apache.sh
|
#!/bin/bash
set -e
set -o pipefail
set -u
systemctl restart apache2
systemctl daemon-reload
|
Timer et Service
Voici un Timer units qui permet de renouveler les certificats tous les mois.
/etc/systemd/system/letsencrypt.timer
|
[Unit]
Description=Monthly renewal of Let's Encrypt's certificates
[Timer]
OnCalendar=monthly
Persistent=true
[Install]
WantedBy=timers.target
|
/etc/systemd/system/letsencrypt.service
|
[Unit]
Description=Let's Encrypt renewal
[Service]
Type=oneshot
ExecStart=/usr/bin/letsencrypt certonly --renew-by-default -m email@domain.fr --webroot -w /usr/share/webapps/monsite1 -d www1.domain.fr --rsa-key-size 4096
ExecStart=/usr/bin/letsencrypt certonly --renew-by-default -m email@domain.fr --webroot -w /usr/share/webapps/monsite2 -d www2.domain.fr --rsa-key-size 4096
ExecStartPost=/usr/sbin/systemctl restart nginx.service
|
|
systemctl enable letsencrypt.timer
systemctl start letsencrypt.timer
systemctl list-timers
|
Utiliser le plugin DNS OVH
|
sudo snap install certbot --classic
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-ovh
sudo apt install python3-certbot-dns-ovh
sudo apt install python3-pip
pip3 install certbot
pip3 install certbot-dns-ovh
|
/root/.ovh-api.ini
|
dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = ???
dns_ovh_application_secret = ???
dns_ovh_consumer_key = ???
|
|
sudo chmod 600 /root/.ovh-api.ini
|
Renouvellement du certificat
/usr/local/sbin/renew-certificate.sh
|
#!/bin/bash
set -e
set -o pipefail
set -u
/usr/bin/certbot certonly \
--dns-ovh \
--dns-ovh-credentials /root/.ovh-api.ini \
--non-interactive \
--agree-tos \
--email admin@domain.fr \
-d domain.fr,'*.domain.fr'
|
Si le certificat n'a pas besoin d'être renouvelé:
Cert not yet due for renewal
Keeping the existing certificate
Certificate not yet due for renewal; no action taken.
Erreurs
The currently selected ACME CA endpoint does not support issuing wildcard certificates
|
--server https://acme-v02.api.letsencrypt.org/directory
|
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.
You may need to use an authenticator plugin that can do challenges over DNS.
Dans le cas d'une demande de certificat contenant un wildcard, il faut utiliser la v2 de l'API.
Ce qui oblige à utiliser le challenge DNS, qui n'est accessible qu'en manual ou avec les plugins DNS.
Changing the ACME Server
|
sudo certbot certonly --manual -d 'domain.fr,*.domain.fr'
|
Achat d'un certificat
Génération du CSR
La CA va utiliser le CSR pour créer le certificat. Elle n'a pas besoin de la clé privée.
Une clé privée est générée en même temps que le CSR.
 |
Il est important de générer le CSR et la clé privée sur le serveur sur lequel on installera le certificat. |
|
openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key
openssl req -out CSR.csr -key privateKey.key -new
openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key
openssl req -in server.csr -noout -text
|
Champs du CSR
Champs |
|
Exemple
|
Country Name |
Code ISO de 2 lettres |
FR, CH
|
State or Province Name |
Semble être obligatoire même hors US |
|
Common Name |
L'url du site |
www.domaine.fr
|
CSR file.txt
|
-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST-----
|
Fichiers fournis
- SSL certificate (ssl_certificate.cer): clé publique
- Intermediate certificate (IntermediateCA.cer): émetteur du EndEntity certificate (aussi nommé CA/Chaining certificate)
- Croos Root CA (crossRootCA.cer): certificat obsolète, utilisé pour des raisons de compatibilité
Correspondance entre clé RSA publique, privée et CSR
|
openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5
openssl req -noout -modulus -in server.csr | openssl md5
|
Gestion des certificats installé dans Windows
Win → certmgr.msc
|
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
|
unable to write 'random state'
Le dossier ~/.rnd n'est pas accessible.
Avec Cygwin, se produit si la console n'a jamais été lancée.
Erreurs
Les profils temporaires sont utilisés si le profil de l’utilisateur est inaccessible ou corrompu. [1]
Ou les profils temporaires sont utilisé car le poste (avec un terminal server) a été configuré ainsi.
Dans ce cas, plusieurs solutions possibles :
- Un fix windows
- Installer le certificat sur le serveur où se connecte les clients et utiliser du coup le store windows plutôt que le fichier de certificat.