Installer un certificat Let’s Encrypt sur un serveur LAMP

Dans la suite de mon post pour pouvoir visualiser les caméras de vidéosurveillance avec zmNinja sur un mobile, je me basais sur un serveur LAMP (Linux+Apache+MariaDB+PHP) personnel accessible sur internet avec une adresse fixe fournie par No-IP. Or jusqu’à présent j’utilisais un certificat autosigné pour chiffrer la connexion avec SSL et ça me générait une exception avec le navigateur qu’il faut accepter.

Il se trouve que certains navigateurs refusent qu’on puisse accepter le risque et exige un certificat reconnu par une autorité qualifiée. Je suis donc passé par Let’s Encrypt pour bénéficier d’un certificat valide.

Pour ma mageia je me suis reposé sur cette page, on installera tout d’abord le package lib64augeas-devel et on tapera ensuite en tant que root les commandes successives :

python3 -m venv /opt/certbot/
/opt/certbot/bin/pip install --upgrade pip

Voilà le résultat :

Requirement already satisfied: pip in /opt/certbot/lib/python3.10/site-packages (23.0.1)
Collecting pip
  Downloading pip-25.0-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 6.9 MB/s eta 0:00:00
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 23.0.1
    Uninstalling pip-23.0.1:
      Successfully uninstalled pip-23.0.1
Successfully installed pip-25.0

puis on tape :

/opt/certbot/bin/pip install certbot certbot-apache

Voilà le résultat (extrait) :

Collecting certbot
  Downloading certbot-3.1.0-py3-none-any.whl.metadata (7.9 kB)
Collecting certbot-apache
  Downloading certbot_apache-3.1.0-py3-none-any.whl.metadata (1.3 kB)
Collecting acme>=3.1.0 (from certbot)
  Downloading acme-3.1.0-py3-none-any.whl.metadata (1.3 kB)
Collecting ConfigArgParse>=1.5.3 (from certbot)
  Downloading ConfigArgParse-1.7-py3-none-any.whl.metadata (23 kB)

(...)

Downloading urllib3-2.3.0-py3-none-any.whl (128 kB)
Using cached pycparser-2.22-py3-none-any.whl (117 kB)
Building wheels for collected packages: python-augeas
  Building wheel for python-augeas (pyproject.toml) ... done
  Created wheel for python-augeas: filename=python_augeas-1.1.0-py3-none-any.whl size=21254 sha256=36a415257635e6d1f8c6d86e979e3942a1cff4d0582e8d7be3a55aa7be9dfa71
  Stored in directory: /root/.cache/pip/wheels/b6/10/67/b10ab09e701005d015b7be1488a552f221f5e065645c6f39ee
Successfully built python-augeas
Installing collected packages: pytz, pyrfc3339, parsedatetime, urllib3, typing-extensions, pycparser, idna, distro, configobj, ConfigArgParse, charset-normalizer, certifi, requests, cf
fi, python-augeas, cryptography, PyOpenSSL, josepy, acme, certbot, certbot-apache
Successfully installed ConfigArgParse-1.7 PyOpenSSL-25.0.0 acme-3.1.0 certbot-3.1.0 certbot-apache-3.1.0 certifi-2025.1.31 cffi-1.17.1 charset-normalizer-3.4.1 configobj-5.0.9 cryptogr

On crée ensuite les liens suivants :

ln -s /opt/certbot/bin/certbot /usr/bin/certbot
ln -s /usr/local/apache2/bin/httpd /usr/local/sbin
ln -s /usr/local/apache2/bin/apachectl /usr/local/bin


j’ai créé le répertoire  /etc/httpd/conf.d et avant d’aller plus loin le fichier de configuration d’Apache httpd.conf doit être configuré pour qu’il existe bien un hôte virtuel sur le port 80 avec l’adresse visible d’internet :

<VirtualHost 192.168.13.11:80>
ServerName adresseperso.ddns.net
DocumentRoot /usr/local/apache2/htdocs
ErrorLog logs/ddns-error_log
TransferLog logs/ddns-access_log
</VirtualHost>

On tape ensuite :

certbot --apache --apache-server-root /usr/local/apache2

Voilà le résultat :

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): olivier.hoarau@funix.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.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: N
Account registered.

Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: adresseperso.ddns.net
2: funix-mana.kervao.fr
3: hoarau-mana.kervao.fr
4: sql-mana.kervao.fr
5: mana.kervao.fr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for adresseperso.ddns.net

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/adresseperso.ddns.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/adresseperso.ddns.net/privkey.pem
This certificate expires on 2025-05-09.
These files will be updated when the certificate renews.

Deploying certificate
Successfully deployed certificate for adresseperso.ddns.net to /usr/local/apache2/conf/httpd-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://adresseperso.ddns.net

NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functional
ity. See https://certbot.org/renewal-setup for instructions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Il va créer le fichier /usr/local/apache2/conf/httpd-le-ssl.conf qui contiendra :

<IfModule mod_ssl.c>
<VirtualHost 192.168.13.11:443>
ServerName adresseperso.ddns.net
DocumentRoot /usr/local/apache2/htdocs
ErrorLog logs/ddns-error_log
TransferLog logs/ddns-access_log

SSLCertificateFile /etc/letsencrypt/live/adresseperso.ddns.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/adresseperso.ddns.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

et il modifiera le fichier /usr/local/apache2/conf/httpd.conf qui contiendra :

LoadModule ssl_module modules/mod_ssl.so

(...)

# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

(...)

<VirtualHost 192.168.13.11:80>
ServerName adresseperso.ddns.net
DocumentRoot /usr/local/apache2/htdocs
ErrorLog logs/ddns-error_log
TransferLog logs/ddns-access_log
RewriteEngine on
RewriteCond %{SERVER_NAME} =adresseperso.ddns.net
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

(...)

Include /usr/local/apache2/conf/httpd-le-ssl.conf

Tous les fichiers de configuration de let’s encrypt se retrouvent sous /etc/letsencrypt, les certificats sont sous /etc/letsencrypt/live/adresseperso.ddns.net. Maintenant le certicat a une durée de vie limitée et il est possible de le renouveler automatiquement, tout est indiqué ici. Il suffit de taper simplement la commande suivante en tant que root dans un terminal :

SLEEPTIME=$(awk 'BEGIN{srand(); print int(rand()*(3600+1))}'); echo "0 0,12 * * * root sleep $SLEEPTIME && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

Voilà le contenu de mon fichier /etc/crontab :

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root nice -n 19 run-parts --report /etc/cron.hourly
02 4 * * * root nice -n 19 run-parts --report /etc/cron.daily
22 4 * * 0 root nice -n 19 run-parts --report /etc/cron.weekly
42 4 1 * * root nice -n 19 run-parts --report /etc/cron.monthly
0 0,12 * * * root sleep 2501 && certbot renew -q

On relance crond avec la commande systemctl restart crond

A noter qu’il est important de vérifier que cerbot est bien à jour, pour ce faire il faut taper au moins tous les mois la commande suivante :

/opt/certbot/bin/pip install --upgrade certbot certbot-apache

Voilà le résultat (extrait) :


Requirement already satisfied: certbot in /opt/certbot/lib/python3.10/site-packages (3.1.0)
Requirement already satisfied: certbot-apache in /opt/certbot/lib/python3.10/site-packages (3.1.0)
Requirement already satisfied: acme>=3.1.0 in /opt/certbot/lib/python3.10/site-packages (from certbot) (3.1.0)
Requirement already satisfied: ConfigArgParse>=1.5.3 in /opt/certbot/lib/python3.10/site-packages (from certbot) (1.7)

(...)

Requirement already satisfied: typing-extensions>=4.9 in /opt/certbot/lib/python3.10/site-packages (from PyOpenSSL!=23.1.0,>=17.5.0->acme>=3.1.0->certbot) (4.12.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /opt/certbot/lib/python3.10/site-packages (from requests>=2.20.0->acme>=3.1.0->certbot) (3.4.1)
Requirement already satisfied: idna<4,>=2.5 in /opt/certbot/lib/python3.10/site-packages (from requests>=2.20.0->acme>=3.1.0->certbot) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/certbot/lib/python3.10/site-packages (from requests>=2.20.0->acme>=3.1.0->certbot) (2.3.0)
Requirement already satisfied: certifi>=2017.4.17 in /opt/certbot/lib/python3.10/site-packages (from requests>=2.20.0->acme>=3.1.0->certbot) (2025.1.31)

le plus simple est de créer le fichier /etc/cron.monthly/certbot-update qui contiendra :

#!/bin/bash
/opt/certbot/bin/pip install --upgrade certbot certbot-apache

qui fera ça en tâche de fond.

Laisser un commentaire