Let’s Encrypt

>

Let’s Encrypt証明書を取得してhttpsアクセス

環境
CentOS Stream release 9
Apache/2.4.57 (CentOS Stream)
Xserver VPS

EPELインストール

dnf install epel-release

Snapインストール

dnf --enablerepo=epel install snapd

snapd 起動と自動起動設定

systemctl enable --now snapd.socket

シンボリックリンク作成

ln -s /var/lib/snapd/snap /snap

core パッケージをインストール

snap install core

certbotインストール

snap install --classic certbot

シンボリックリンクを作成

ln -s /snap/bin/certbot /usr/bin/certbot

certbotコマンドでLet’s Encrypt証明書を取得してhttpsでサイトにアクセスできるようにする解説。
対象サイトはmysite.comで/etc/httpd/conf.d/mysite.com.confのようにmysite.com用の独自confファイルが既に設置してあり下記の内容になっているのが前提。

<VirtualHost *:80>
    ServerName mysite.com
    DocumentRoot /var/www/html/mysite

    # for Let's Encrypt
    Alias /.well-known /var/www/html/mysite/.well-known

    <Directory /var/www/html/mysite
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

 

certbotコマンドで証明書を取得する

certbot certonly --webroot -w /var/www/html/mysite.com -d mysite.com -m info@mysite.com --agree-tos
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for mysite.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mysite.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mysite.com/privkey.pem
This certificate expires on 2025-01-21.
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

上記のように表示されればOK。
あとはfullchain.pemとprivkey.pemのパスをssl.confで指定する。

vi /etc/httpd/conf.d/ssl.conf

↓記述内容

<VirtualHost *:443>
ServerName mysite.com
DocumentRoot "/var/www/html/mysite"
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
<Directory "/var/www/html/mysite">
AllowOverride All
Require all granted
</Directory>
ErrorLog logs/mysite-ssl_error_log
CustomLog logs/mysite-ssl_access_log combined
</VirtualHost>

あとはブラウザでhttps://mysite.comにアクセスできれば完了。
Apache2.4.7未満は下記のように記述するとの説もあるがApache2.4.57であっても上記のように二項目の記述だけで現状問題なくhttpsアクセスできている。

SSLCertificateFile /etc/letsencrypt/live/mysite.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mysite.com/chain.pem

 

サイトが複数あり独自ドメイン、サブドメインまとめてワイルドカードで取得し一つの証明書で管理したいと思う場合もあるが、事前にDNSの登録を行う必要があり、それらの手間を考えるとそれほど賢明な方法だとは思わない。
証明書の有効期限は三カ月で期限が切れる前に更新する必要が生じる。
cronで更新処理を定期実行させるのが常套手段となるが、DNS登録ありきのワイルドカードによる証明書取得だとそのあたりに融通が利かない。サーバーにもよるが、どうしても手動による更新作業がついてまわる。
結局のところサイトごとに証明書を取得してcronで更新処理を自動化させるのが賢明だと自分は思っている。
証明書の更新コマンド(毎月1日の1時に更新してその旨をメール受信する ※実際のところ更新期限の30日前にならなければ更新処理は行われない)

0 1 1 * * certbot renew 2>&1 | mail -s "Let's Encrypt update information" info@mysite.com && systemctl restart httpd

処理を毎日行うように記述してる例もあるようだが意味が分からない。

サイトごとの独自confファイルのVirtualHost *:80側で下記のようにhttpでアクセスしてきても強制的にhttpsにしてしまうのを推奨してる情報もあるが

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

更新処理のことを考えると微妙なので自分は行っていない。