Contents
1.Obtain an SSL certificate ( Let's Encrypt )
Install the latest open ssl
1 |
# dnf install openssl-devel |
1.1 advance preparation
1.Package management system Snappy installed
Since the SSL certificate issuing tool "certbot" of Let's Encrypt is recommended to be installed using "snap" after 2021, install Snapd first.(Can also be installed the traditional way with dnf or yum)
1 2 |
# dnf upgrade # dnf install snapd |
Enable Classics Snap support
1 |
# ln -s /var/lib/snapd/snap /snap |
Enable Classics Snap support
1 2 |
# systemctl enable --now snapd Created symlink /etc/systemd/system/multi-user.target.wants/snapd.service → /usr/lib/systemd/system/snapd.service. |
Version Check
1 2 3 4 5 6 |
# snap --version snap 2.58.3-1.fc38 snapd 2.58.3-1.fc38 series 16 fedora 38 kernel 6.2.11-300.fc38.x86_64 |
Log out and log in again or reboot the system to ensure that the snap path is updated correctly
2.certbot package install
1 2 |
# snap install --classic certbot certbot 2.5.0 from Certbot Project (certbot-eff?) installed |
Create symbolic link to /snap/bin/certbot
1 |
# ln -s /snap/bin/certbot /usr/bin/certbot |
Confirmation
1 2 3 4 5 |
# ls -la /usr/bin/certbot lrwxrwxrwx 1 root root 17 Apr 25 14:40 /usr/bin/certbot -> /snap/bin/certbot # ls -la /snap/bin/certbot lrwxrwxrwx 1 root root 13 Apr 25 14:39 /snap/bin/certbot -> /usr/bin/snap |
1.2 Obtaining Certificates
1 |
# certbot certonly --webroot -w /var/www/html/[FQDN] -d [FQDN] |
Registration of e-mail address and agreement to terms of use are required for the first time only.
Specify an email address to receive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): <Mail Address> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 <FQDN> Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/<FQDN>/fullchain.pem Key is saved at: /etc/letsencrypt/live/<FQDN>/privkey.pem This certificate expires on 2023-07-24. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
Success if displayed"Successfully received certificate".
The following certificate is obtained under [/etc/letsencrypt/live//] as described in the message
cert.pem ⇒ SSL server certificate (including public key)
chain.pem ⇒ intermediate certificate
fullchain.pem ⇒ File containing cert.pem and chain.pem combined
privkey.pem ⇒ private key
※ Obtaining a Let's Encrypt certificate when the web server is not running
It is a prerequisite that the server on which the work is to be performed is accessible from the Internet at port 80.
Use the simple Web server function by specifying [--standalone].
-d [FQDN from which you want to obtain a certificate].
FQDN (Fully Qualified Domain Name) :Hostname. Domain name without abbreviation
If there are multiple FQDNs for which you want to obtain certificates, specify multiple -d [FQDNs for which you want to obtain certificates
1 |
# certbot certonly --standalone -d <FQDN> |
Renewing certificates already obtained
Renew all certificates with an expiration date of less than 30 days
If you want to renew regardless of the number of days remaining on the expiration date, specify [--force-renewal] as well.
1 |
# certbot --force-renewal renew |
1.2Automatic renewal of certificates(Let's Encrypt)
①Pre-registration testing
First, test the automatic update using the following --dry-run option.
With this option, certificates are not renewed, only checked, so there is no need to worry about getting stuck with a limit on the number of times a certificate can be obtained.
1 |
# certbot renew --dry-run |
②When you install the snap version of certbot, the automatic certificate renewal function is also installed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# systemctl list-timers | less NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2023-04-25 15:48:19 JST 1h 0min left Tue 2023-04-25 13:05:32 JST 1h 42min ago dnf-makecache.timer dnf-makecache.service Tue 2023-04-25 23:47:00 JST 8h left - - snap.certbot.renew.timer snap.certbot.renew.service Wed 2023-04-26 00:00:00 JST 9h left Tue 2023-04-25 08:37:57 JST 6h ago logrotate.timer logrotate.service Wed 2023-04-26 00:00:00 JST 9h left - - sa-update.timer sa-update.service Wed 2023-04-26 09:24:31 JST 18h left Tue 2023-04-25 09:59:21 JST 4h 48min ago plocate-updatedb.timer plocate-updatedb.service Wed 2023-04-26 13:53:12 JST 23h left Tue 2023-04-25 13:04:24 JST 1h 43min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Sun 2023-04-30 01:00:00 JST 4 days left Sun 2023-04-23 22:33:22 JST 1 day 16h ago raid-check.timer raid-check.service Mon 2023-05-01 00:58:13 JST 5 days left Mon 2023-04-24 08:14:57 JST 1 day 6h ago fstrim.timer fstrim.service 8 timers listed. Pass --all to see loaded but inactive timers, too. |
snap.certbot.renew.timer is registered
Check the unit file snap.certbot.renew.timer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# vi /etc/systemd/system/snap.certbot.renew.timer [Unit] # Auto-generated, DO NOT EDIT Description=Timer renew for snap application certbot.renew Requires=var-lib-snapd-snap-certbot-2913.mount After=var-lib-snapd-snap-certbot-2913.mount X-Snappy=yes [Timer] Unit=snap.certbot.renew.service OnCalendar=*-*-* 04:03 OnCalendar=*-*-* 23:47 [Install] WantedBy=timers.target |
According to the above configuration, it will attempt to update at 5:17 and 16:20 every day as specified in the OnCalender parameter(However, the set time changes randomly with each update)
Check the unit file snap.certbot.renew.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# vi /etc/systemd/system/snap.certbot.renew.service [Unit] # Auto-generated, DO NOT EDIT Description=Service for snap application certbot.renew Requires=var-lib-snapd-snap-certbot-2913.mount Wants=network.target After=var-lib-snapd-snap-certbot-2913.mount network.target snapd.apparmor.service X-Snappy=yes [Service] EnvironmentFile=-/etc/environment ExecStart=/usr/bin/snap run --timer="00:00~24:00/2" certbot.renew SyslogIdentifier=certbot.renew Restart=no WorkingDirectory=/var/snap/certbot/2913 TimeoutStopSec=30 Type=oneshot |
However, the web server using the certificate will not be restarted, so set up a script to run automatically after the update
1 2 3 4 |
# vi /etc/letsencrypt/renewal-hooks/post/web_restart.sh #!/bin/bash systemctl reload httpd |
1 |
# chmod 755 /etc/letsencrypt/renewal-hooks/post/web_restart.sh |
2. Converting Apache to https
Install the following just in case
1 |
# dnf -y install mod_ssl |
2.1 Edit ssl.conf file
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# vi /etc/httpd/conf.d/ssl.conf ●Line 59 : Uncomment and change DocumentRoot "/var/www/html/<FQDN>" ●Line 60 : Uncomment and change ServerName <Domaine name>:443 ●Line 101 : Make it a comment and add it below # SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateFile /etc/letsencrypt/live/<FQDN>/cert.pem ●Line 109 : Make it a comment and add it below # SSLCertificateKeyFile /etc/pki/tls/private/localhost.key SSLCertificateKeyFile /etc/letsencrypt/live/<FQDN>/privkey.pem ●Line 119 : Add SSLCertificateChainFile /etc/letsencrypt/live/<FQDN>/chain.pem |
Apache restart
1 |
# systemctl restart httpd |
Allow https in Firewall
1 2 3 4 |
# firewall-cmd --add-service=https --permanent success # firewall-cmd --reload success |
2.2 Redirect HTTP communications to HTTPS
.htaccessを/var/www/html/[FQDN]/ 配下に作成
1 |
# vi /var/www/html/[FQDN]/.htaccess |
Contents of .htaccess
1 2 3 |
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] |
3. SSL/TLS (Let's Encrypt) settings on the mail server
3.1 Obtaining a certificate for the mail server
Obtain a certificate for the mail server, but since it cannot be obtained in the same way as above, stop the web server once and add the "--standalone" option.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# systemctl stop httpd.service # certbot certonly --standalone -d mail.<domain name> Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for mail.<domain name> Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/mail.<domain name>/fullchain.pem Key is saved at: /etc/letsencrypt/live/mail.<domain name>/privkey.pem This certificate expires on 2023-07-24. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
3.2 Postfix Configuration
1 2 3 4 5 6 7 8 9 10 11 |
# vi /etc/postfix/main.cf ● Line 719, 725 : comment #smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem #smtpd_tls_key_file = /etc/pki/tls/private/postfix.key ● Add to the last line smtpd_use_tls = yes smtp_tls_mandatory_protocols = !SSLv2, !SSLv3 smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3 smtpd_tls_cert_file = /etc/letsencrypt/live/mail.<domain name>/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/mail.<domain name>/privkey.pem smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache |
1 2 3 4 5 6 7 8 9 10 11 12 |
# vi /etc/postfix/master.cf ● Line 21-24 : Uncomment submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes ● If SMTPS (465) is used, add to the last line smtps inet n - n - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes |
3.3 Dovecot Settings
1 2 3 4 5 6 |
# vi /etc/dovecot/conf.d/10-ssl.conf ● Line 9:confirmation ssl = yes ● Line 14,15:Make it a comment and add certificate/key file designation under it ssl_cert = </etc/letsencrypt/live/mail.<domain name>/fullchain.pem ssl_key = </etc/letsencrypt/live/mail.<domain name>/privkey.pem |
Allow Port 587 in firewall
1 2 |
# firewall-cmd --add-port=587/tcp --permanent # firewall-cmd --reload |
1 |
# systemctl restart postfix dovecot |
3.4 Thunderbird Settings
Receiving server
Port : 143
Connection security : STARTTLS
Authentication method : Normal password
Sending server
Port : 587
Connection security : STARTTLS
Authentication method : Normal password