====== ssl ======
Ou comment avoir un **https** pour son site.
Cette page est à réorganiser car il y a eu beaucoup de test et certaines infos sont obsolètes. Voici quelques liens :
* https://letsencrypt.org/ Fournisseur de certificat (voir plus bas dans la page)
* https://mozilla.github.io/server-side-tls/ssl-config-generator/ un générateur de config pour votre serveur web
* https://www.ssllabs.com/ssltest/ pour tester sir votre site est bien configuré
* https://blog.blaisot.org/letsencrypt-wildcard-part1.html
===== Avec Let's Encrypt =====
**MAJ 2024**
En résumé sur une fresh debian 11
apt install certbot python3-certbot-apache
# certbot --apache -d edmc73.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): toto@toto.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for edmc73.com
Performing the following challenges:
http-01 challenge for edmc73.com
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://edmc73.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Subscribe to the EFF mailing list (email: toto@toto.com).
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/edmc73.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/edmc73.com/privkey.pem
Your certificate will expire on 2024-03-16. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again with the "certonly" option. To non-interactively
renew *all* of your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
On se retrouve donc avec un nouveau fichier de config dans apache tout configuré pour que ça fonctionne en https.
-------------------------
Let's Encrypt a bien évolué depuis sa version beta, je vais maintenant mettre mes scripts à jour et détailler le fonctionnement sur Debian 7 et Apache
Le script s'appelle maintenant **Certbot** et les sources sont dispo sur https://github.com/certbot/certbot
Le site suivant permet de faciliter l'installation de **Certbot** => https://certbot.eff.org/
>Sinon il y a toujours le script standalone => https://dl.eff.org/certbot-auto
**certbot** est dispo dans le dépôt backport de debian. Il suffit d'ajouter ce dépôt dans votre **/etc/apt/sources.list**
deb http://ftp.debian.org/debian jessie-backports main
# apt update
# apt install certbot
Pour émettre un certificat, letsencrypt doit s’assurer que vous avez bien la main sur les ressources à certifier. Letsencrypt propose 3 types de challenge :
* HTTP-01 : challenge par requête http, le plus couramment utilisé pour les certificats simples
* TLS-SNI-01 : challenge par présentation de certificat TLS. Ce challenge a été désactivé suite à des problèmes de sécurité.
* DNS-01 : challenge par requête DNS sur une entrée TXT dans le domaine.
Si dans le cas d’un site web, cette validation se résume généralement à vérifier que vous avez la main sur le serveur web, dans le cas d’un certificat wildcard il faut prouver que vous avez la main sur l’ensemble du domaine. Aussi, seul le challenge DNS-01 est possible pour des certificats wildcard letsencrypt, il faudra donc pouvoir éditer votre zone DNS pour commander ce type de certificat.
Je décide d'utiliser le plugins webroot qui permet de générer les fichiers de certificat et de nous laisser libre de configurer apache comme on souhaite
# certbot certonly --webroot -w /home/public_html/wiki.p2pfr.com/ -d wiki.p2pfr.com
La première fois que vous lancerez ce script, il vous sera demandé une adresse email et d'accepter les Terms of Service.
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/wiki.p2pfr.com/fullchain.pem. Your cert will
expire on 2016-08-11. To obtain a new version of the certificate in
the future, simply run Certbot again.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Dans le cas d'un wildcard avec authentification par DNS
# certbot certonly --manual -d '*.edmc73.com'
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for edmc73.com
-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.edmc73.com with the following value:
6CmoURMbv3F14hJdzR8zqXrhcYJeKWJEhT8xZcz4gUY
Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
C'est à ce moment la que vous allez ajouter une entrée DNS sur votre nom de domaine. Ensuite pressez Enter :)
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/edmc73.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/edmc73.com/privkey.pem
Your cert will expire on 2033-06-13. To obtain a new or tweaked
version of this certificate in the future, simply run
letsencrypt-auto again. To non-interactively renew *all* of your
certificates, run "letsencrypt-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Attention, la méthode par DNS a une validation manuel et ne permet pas facilement d'être renouvelé automatiquement
Vous devrez retaper la commande suivante pour renouveler le certificat à la main.
# certbot certonly --manual -d *.edmc73.com
Voir la doc: https://certbot.eff.org/docs/using.html#pre-and-post-validation-hooks\\
Et un tuto pour automatiser avec l'api ovh: https://buzut.net/certbot-challenge-dns-ovh-wildcard/
Tous les fichiers sont dans **/etc/letsencrypt**
Maintenant nous avons 4 fichiers prêt à l'emploi pour configurer notre Apache
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/letsencrypt/live/wiki.p2pfr.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/wiki.p2pfr.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/wiki.p2pfr.com/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/wiki.p2pfr.com/fullchain.pem
SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown
ou bien, variante fourni par letsencrypt
# Baseline setting to Include for SSL sites
SSLEngine on
# Intermediate configuration, tweak to your needs
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
# Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
#CustomLog /var/log/apache2/access.log vhost_combined
#LogLevel warn
#ErrorLog /var/log/apache2/error.log
# Always ensure Cookies have "Secure" set (JAH 2012/1)
#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4"
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/letsencrypt/live/wiki.p2pfr.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/wiki.p2pfr.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/wiki.p2pfr.com/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/wiki.p2pfr.com/fullchain.pem
SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown
On reload apache
service apache2 reload
Pour automatiser le renouvellement des certificats, il faut simplement faire un cron qui tourne 2 fois par jours comme le conseil let's encrypt avec la commande
# ./certbot-auto renew --quiet --no-self-upgrade
Cette commande va vérifier automatiquement tous vos certificats installés et si l'un d'eux expire, il va le mettre à jour automatiquement.
Exemple de certificat valide
Checking for new version...
Requesting root privileges to run certbot...
/root/.local/share/letsencrypt/bin/letsencrypt renew
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/wiki.p2pfr.com.conf
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/forum.p2pfr.com.conf
-------------------------------------------------------------------------------
The following certs are not due for renewal yet:
/etc/letsencrypt/live/wiki.p2pfr.com/fullchain.pem (skipped)
/etc/letsencrypt/live/forum.p2pfr.com/fullchain.pem (skipped)
No renewals were attempted.
Exemple de certificat mis à jour
Checking for new version...
Requesting root privileges to run certbot...
/root/.local/share/letsencrypt/bin/letsencrypt renew
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/wiki.p2pfr.com.conf
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/forum.p2pfr.com.conf
-------------------------------------------------------------------------------
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/wiki.p2pfr.com/fullchain.pem (success)
/etc/letsencrypt/live/forum.p2pfr.com/fullchain.pem (success)
Voici mon cron qui permet dans le cas où un certificat est renouvelé de recharger apache et d'envoyer un mail. Je le lance 2 fois par jour comme le dit la doc. Adapter le chemin de votre script et mettez votre adresse email à la place de root si vous n'avez pas créé d'alias pour root.
13 5,17 * * * /root/letsencrypt/certbot-auto renew -q --no-self-upgrade --renew-hook 'service apache2 reload && echo "Mise à jour pour le domaine $RENEWED_DOMAINS" | mail -s "Mise à jour des certificats SSL" root'
Et voila, vous n'aurez plus d'excuse maintenant pour ne pas avoir un site en https :)
==== module apache ====
Dans le cas d'un site web en python ou autre animal du genre ou on doit utiliser un proxy et donc bref, ça devient chiant.
certbot --apache -d edmc73.com -d www.edmc73.com
Ce module va écrire une config temporaire dans apache pour que letsencrypt accède facilement à son fichier de vérification
certbot_apache._internal.http_01:Adding a temporary challenge validation Include for name: edmc73.com in: /etc/apache2/sites-enabled/edmc73.com.conf
certbot_apache._internal.http_01:writing a pre config file with text:
RewriteEngine on
RewriteRule ^/\.well-known/acme-challenge/([A-Za-z0-9-_=]+)$ /var/lib/letsencrypt/http_challenges/$1 [END]
certbot_apache._internal.http_01:writing a post config file with text:
Require all granted
Require all granted
certbot.reverter:Creating backup of /etc/apache2/sites-enabled/edmc73.com.conf
==== Commandes ====
Partie fonctionnelle
La commande qui va bien, pensez bien à associer le certificat pour le nom de domaine + le www.
# ./certbot-auto certonly --webroot -w /home/public_html/p2pfr.com -d p2pfr.com -d www.p2pfr.com --expand
Ne pas oublié un reload d'apache pour que le nouveau certificat soit pris en compte.
service apache2 reload
Pour voir la liste des certificats installés sur le système
./certbot-auto certificates
Ensuite pour supprimer un certificat du système
./certbot-auto delete --cert-name p2pfr.com
Si vous changer le path dans votre config apache, vous pouvez modifier la config letsencrypt à la main dans **/etc/letsencrypt/renewal/xxxx.conf** ensuite, tester si tout se passe bien avec la commande
certbot renew --dry-run
===== Avec certbot de debian =====
Maintenant certbot est directement intégré à debian 8 Jessie
La tache renew est maintenant un peu plus complexe car elle utilise systemd mais aussi le cron au cas ou systemd serait absent..
Bref, pour continuer de recevoir un mail à chaque renouvellement, il faut modifier le fichier **/lib/systemd/system/certbot.service** et ajouter du code après la commande **/usr/bin/certbot -q renew**
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStartPre=/usr/bin/perl -e 'sleep int(rand(3600))'
ExecStart=/usr/bin/certbot -q renew --no-self-upgrade --renew-hook 'service apache2 reload && echo "Mise à jour pour le domaine $RENEWED_DOMAINS" | mail -s "Mise à jour des certificats SSL" root'
PrivateTmp=true
===== Config apache pour centraliser les acme-challenge =====
En mode certonly, letsencrypt crée un répertoire à la racine de votre site web **.well-known/acme-challenge/xxxxxxxxxxxxx** pour vérifier que votre serveur appartient bien au nom de domaine. Oui mais voila, dans certain cas, vous avez configuré votre site web soit en full https, donc http non dispo, ou alors il y a une application qui redirige toutes les urls vers un script, bref, pas possible d'accéder au répertoire.
Nous allons créer une config apache qui va centraliser toutes ces demandes dans un répertoire unique, par exemple **/var/www/letsencrypt**
Créez le répertoire **/var/www/letsencrypt**
mkdir /var/www/letsencrypt
Créez le fichier **/etc/apache2/conf-available/letsencrypt.conf**
Alias /.well-known/acme-challenge /var/www/letsencrypt/.well-known/acme-challenge
Options -Indexes
AllowOverride all
Require all granted
a2enconf letsencrypt
systemctl reload apache2
et maintenant la commande certbot a utiliser
certbot certonly --webroot -w /var/www/letsencrypt/ -d edmc73.com
Ce sera le même répertoire pour tous les domaines de votre serveur.
Si vous utilisez un proxy pass, attention à exclure le chemin de letsencrypt comme ceci
ProxyPass /.well-known/acme-challenge !
ProxyPass / http://127.0.0.1:6000/
ProxyPassReverse / http://127.0.0.1:6000/
===== Alternative à certbot =====
Si comme moi vous trouvez un peu relou l'installation de certbot qui fait du apt install dans tous les sens pour mettre un environnement python dont vous n'avez pas forcement besoin, alors vous allez aimer **acme.sh**
https://github.com/Neilpang/acme.sh
An ACME protocol client written purely in Shell (Unix shell) language.
Full ACME protocol implementation.
Simple, powerful and very easy to use. You only need 3 minutes to learn it.
Bash, dash and sh compatible.
Simplest shell script for Let's Encrypt free certificate client.
Purely written in Shell with no dependencies on python or the official Let's Encrypt client.
Just one script to issue, renew and install your certificates automatically.
DOES NOT require root/sudoer access.
It's probably the easiest&smallest&smartest shell script to automatically issue & renew the free certificates from Let's Encrypt.
Pas encore encore testé, mais recommandé par proxmox ( https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x_and_newer)#CAs_other_than_Let.27s_Encrypt )
===== Let's encrypt sur centos avec nginx en reverse proxy =====
en gros suivre ce guide officiel => https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
yum install python2-certbot-nginx
Pour ne pas toucher à ma conf nginx j'ai lancé la commande suivante
certbot --nginx certonly -d monnomdedomaine.fr
Cela permet d'ajouter temporairement une config nginx juste pour vérifier que le nom de domaine pointe bien sur notre serveur et de tout remettre comme avant.
Les certificats se trouvent dans /etc/letsencrypt/live/xxxx
Pour vérifier, lancez simplement la commande
certbot certificates
Exemple de conf nginx
server {
listen 80;
server_name votrenomde.domaine;
# pour forcer le site en https
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443;
server_name votrenomde.domaine;
ssl on;
ssl_certificate /etc/letsencrypt/live/votrenomde.domaineg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/votrenomde.domaine/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
location / {
proxy_pass http://192.168.0.60/;
}
}
===== Avec StartSSL =====
Aller sur ce site => http://www.startssl.com/ et créez-vous un compte. Il faudra ensuite installer le certificat qu'il vous fournirons pour vous identifier.
Vous devrez valider votre email et nom de domaine en cliquant sur **Validations Wizard**
Toujours dans **Validations Wizard** vous devez faire vérifier votre nom de domaine en choisissant **Domain Name Validation**
Un mail de vérification sera envoyé à l'une (que vous choisissez) des adresses email renseigné pour votre nom de domaine.
Ensuite, cliquez sur **Certificates Wizard**, choisissez **Web Server SSL/TLS Certificate** dans la liste et fournissez un mot de passe pour la clé privé.
Copier/coller la clé sur votre serveur. Suivez les indications.
openssl rsa -in ssl.key -out ssl.key
Cliquez sur **Continue** et choisissez votre nom de domaine.
A la fin vous devez avoir 4 fichiers
ca.pem ssl.crt ssl.key sub.class1.server.ca.pem
Configurer ensuite apache dans ce style
DocumentRoot /home/httpd/private
ErrorLog /usr/local/apache/logs/error_log
TransferLog /usr/local/apache/logs/access_log
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /usr/local/apache/conf/ssl.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key
SSLCertificateChainFile /usr/local/apache/conf/sub.class1.server.ca.pem
CustomLog /usr/local/apache/logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"