SSLCertificateFile
and SSLCertificateChainFile lines in the Apache configuration file,
/etc/httpd/conf/httpd.conf
, I saw they were pointing to the
following .pem files (.pem stands for
"Privacy-Enhanced
Mail" and a .pem file holds a security certificate).
SSLCertificateFile /etc/letsencrypt/live/support.moonpoint.com-0001/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/support.moonpoint.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/support.moonpoint.com-0001/chain.pem
When I checked the expiration of that security certificate, I saw it was valid until May 17.
# openssl x509 -enddate -noout -in /etc/letsencrypt/live/support.moonpoint.com-0001/cert.pem notAfter=May 17 04:02:51 2024 GMT #
You can determine the location of the .pem file used by Dovecot by
looking for the ssl_cert
variable in
/etc/dovecot/conf.d/10-ssl.conf
.
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_cert = </etc/letsencrypt/live/support.moonpoint.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/support.moonpoint.com/privkey.pem
Since the .pem file specified by ssl_cert was a different .pem file than that being used by Apache, I checked the expiration date of the certificate in the specified .pem file and found it had expired earlier today.
# openssl x509 -enddate -noout -in /etc/letsencrypt/live/support.moonpoint.com/fullchain.pem notAfter=Mar 12 18:06:52 2024 GMT #
When I tried renewing the certificate with a letsencryt renew
command, it failed.
# letsencrypt renew Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/moonpoint.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert is due for renewal, auto-renewing... Plugins selected: Authenticator standalone, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Renewing an existing certificate for moonpoint.com and 2 more domains Performing the following challenges: http-01 challenge for moonpoint.com http-01 challenge for www.moonpoint.com Cleaning up challenges Failed to renew certificate moonpoint.com with error: Problem binding to port 80: Could not bind to IPv4 or IPv6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/support.moonpoint.com-0001.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not yet due for renewal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/support.moonpoint.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert is due for renewal, auto-renewing... Plugins selected: Authenticator standalone, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Renewing an existing certificate for moonpoint.com and 5 more domains Performing the following challenges: http-01 challenge for moonpoint.com http-01 challenge for www.moonpoint.com http-01 challenge for imap.moonpoint.com http-01 challenge for pop3.moonpoint.com http-01 challenge for smtp.moonpoint.com Cleaning up challenges Failed to renew certificate support.moonpoint.com with error: Problem binding to port 80: Could not bind to IPv4 or IPv6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certificates are not due for renewal yet: /etc/letsencrypt/live/support.moonpoint.com-0001/fullchain.pem expires on 2024-05-17 (skipped) All renewals failed. The following certificates could not be renewed: /etc/letsencrypt/live/moonpoint.com/fullchain.pem (failure) /etc/letsencrypt/live/support.moonpoint.com/fullchain.pem (failure) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 renew failure(s), 0 parse failure(s)
At first I thought I might need to stop the Apache webserver first, since
I had encountered a similar problem in the past when renewing the webserver's
security certificate as noted in
Let's Encrypt Problem binding to port 80: Could not bind to IPv4 or IPv6,
but when I stopped the webserver with apachectl
stop
and then issued the letsencrypt renew
command, the
renewal still failed, though the command did restart the Apache webserver.
When I read
Unable to renew LetsEncrypt certificate (HTTP-01 challenge failed), I
thought the issue could be because I am redirecting connectivity to
support.moonpoint.com to support.moonpoint.com/blog/blosxom, but I'm not
using a HTTP 301 redirect
as the person having the problem noted on that webpage
was doing, instead I'm using a "refresh," i.e.,
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/blog/blosxom">
in the head section of the HTML code. I was finally able to resolve the
problem when I looked at the options available for the
letsencrypt renew
with letsencrypt --help
and saw
there was a --apache
parameter I could use.
# letsencrypt --help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ... Certbot can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing the certificate. The most common SUBCOMMANDS and flags are: obtain, install, and renew certificates: (default) run Obtain & install a certificate in your current webserver certonly Obtain or renew a certificate, but do not install it renew Renew all previously obtained certificates that are near expiry enhance Add security enhancements to your existing configuration -d DOMAINS Comma-separated list of domains to obtain a certificate for --apache Use the Apache plugin for authentication & installation --standalone Run a standalone webserver for authentication (the certbot nginx plugin is not installed) --webroot Place files in a server's webroot folder for authentication --manual Obtain certificates interactively, or using shell script hooks -n Run non-interactively --test-cert Obtain a test certificate from a staging server --dry-run Test "renew" or "certonly" without saving any certificates to disk manage certificates: certificates Display information about certificates you have from Certbot revoke Revoke a certificate (supply --cert-name or --cert-path) delete Delete a certificate (supply --cert-name) manage your account: register Create an ACME account unregister Deactivate an ACME account update_account Update an ACME account --agree-tos Agree to the ACME server's Subscriber Agreement -m EMAIL Email address for important account notifications More detailed help: -h, --help [TOPIC] print this message, or detailed help on a topic; the available TOPICS are: all, automation, commands, paths, security, testing, or any of the subcommands or plugins (certonly, renew, install, register, nginx, apache, standalone, webroot, etc.) -h all print a detailed help page including all topics --version print the version number - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
Using that parameter I was able to successfully renew the certificates
with letsencrypt renew --apache
. When I checked the expiration
date for the certificate afterwards, I could see it was now valid until
June 11, 2024.
# openssl x509 -enddate -noout -in /etc/letsencrypt/live/support.moonpoint.com/fullchain.pem notAfter=Jun 11 00:28:36 2024 GMT #
I saw that there was a cron job that runs daily to check for the expiration of the security certificates on the system:
@daily /bin/certbot renew
When I checked the certbot and letsencrypt commands, I found that
letsencrypt pointed to certbot, which in turn points to certbot-2 in the
/usr/bin
directory. So I edited the crontab entry that
checks daily on whether certificates need to be renewed by running
crontab -e
from the root account and modified the certbot entry
to be @daily /bin/certbot renew --apache
(you need to use
vi editor
commands when you update the file with crontab -e
).
# which certbot /bin/certbot # which letsencrypt /bin/letsencrypt # ls -l /bin/certbot lrwxrwxrwx. 1 root root 18 Dec 24 2021 /bin/certbot -> /usr/bin/certbot-2 # ls -l /bin/letsencrypt lrwxrwxrwx. 1 root root 16 Dec 24 2021 /bin/letsencrypt -> /usr/bin/certbot # crontab -e
Now, checking the line with crontab -l
, I have the following:
# crontab -l | grep certbot @daily /bin/certbot renew --apache #
References:
Related: