無料のDV証明書を発行している認証局のLet’s EncryptでSSL証明書を取得する。
大変簡単に言うと、有料で購入しないといけないドメイン認証(DV)のSSL/TLS証明書を無料で発行している認証局がLet’s Encrypt。
無料のオレオレ証明書で暗号化を設定すると、ブラウザ側でエラー警告が出されてしまう。
とはいえ有料の証明書を購入することは抵抗があるという個人ユーザーには大変ありがたい存在。
証明書の有効期限は 90日。今回の手順でインストールすれば自動更新されるように構築してゆく。
詳細は以下参照。
今回はさくらインターネットのVPSを例にインストール方法を記載。
Let’s Encryptのインストール要件
- どこかの会社のroot権限が付与されたVPS等Linuxサーバーで作業できること。(rootユーザーで検証したため)
- 初期構築が完了していること。
- FQDN(www.tech-memo.netなど)のAレコードの参照先を作業サーバーのグローバルIPに設定済であること。
- Apache2.4が構築済で、以下の設定が完了していること。
Let’s Encrypt インストール
事前設定①(Apacheにてバーチャルホスト設定)
/etc/httpd/conf.d/test01.tech-memo.net.confを新規作成し、80番ポート用の待ち受け設定を行う。
後半のコメントアウトはSSL設定後に外す予定。
touch /etc/httpd/conf.d/test01.tech-memo.net.conf
vi /etc/httpd/conf.d/test01.tech-memo.net.conf
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName {IPAddr}
</VirtualHost>
# バーチャルホストのドメインの設定
<VirtualHost tech-memo.net:80>
DocumentRoot /var/www/test01.tech-memo.net
ServerName test01.tech-memo.net
ServerAdmin webmaster@tech-memo.net
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
事前設定②(Snapdインストール)
自動更新に必要なcertbot-autoが非推奨になるとのことなので以下の手順でパッケージ管理ツールのSnapdをインストールする。
dnf --enablerepo=epel -y install snapd
...
Upgraded:
audit-3.0-0.17.20191104git1c2f876.el8.x86_64
audit-libs-3.0-0.17.20191104git1c2f876.el8.x86_64
libsemanage-2.9-3.el8.x86_64
policycoreutils-2.9-9.el8.x86_64
selinux-policy-3.14.3-54.el8_3.4.noarch
selinux-policy-targeted-3.14.3-54.el8_3.4.noarch
Installed:
bash-completion-1:2.7-5.el8.noarch
checkpolicy-2.9-1.el8.x86_64
policycoreutils-python-utils-2.9-9.el8.noarch
python3-audit-3.0-0.17.20191104git1c2f876.el8.x86_64
python3-libsemanage-2.9-3.el8.x86_64
python3-policycoreutils-2.9-9.el8.noarch
python3-setools-4.3.0-2.el8.x86_64
snap-confine-2.49-2.el8.x86_64
snapd-2.49-2.el8.x86_64
snapd-selinux-2.49-2.el8.noarch
Complete!
ln -s /var/lib/snapd/snap /snap
echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' > /etc/profile.d/snap.sh
systemctl enable --now snapd.service snapd.socket
インストール済のパッケージは以下のコマンドで確認可能。helloworldのインストールを勧められるので流れに身を任せてインストールしてみた。
snap list
No snaps are installed yet. Try 'snap install hello-world'.
snap install hello-world
2021-04-29T15:04:41+09:00 INFO Waiting for automatic snapd restart...
hello-world 6.4 from Canonical? installed
事前設定③(mod_sslのインストール)
mod_sslとは、SSL/TLS通信を行うために必要なApacheのモジュール。
なぜか未だにインストール時に同梱されないのでインストール。
yum -y install mod_ssl
....
Installed:
mod_ssl-1:2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64 sscg-2.3.3-14.el8.x86_64
Complete!
Let’s Encrypt インストール
以下サイトを参考にインストール。
snap install certbot --classic
certbot 1.14.0 from Certbot Project (certbot-eff?) installed
ln -s /snap/bin/certbot /usr/bin/certbot
コマンド実行後に気づいたが、snapが/snapなんてディレクトリを作成していて面食らう。無茶するなあ。
以下の書式でコマンドを実行するがエラー
certbot certonly --webroot -w {DocumentRoot} -d {Domain}
なぜ動かないのかわからなかかったけれど、Apacheを停止するの忘れていた。
certbot certonly --webroot -w /var/www/test01.tech-memo.net -d test01.tech-memo.net
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): webmaster@tech-memo.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
404 Page not found - Let's EncryptLet's Encrypt is a free, automated, and open certificate authority brought to you by the nonprofit Internet Security Res... 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 test01.tech-memo.net
Performing the following challenges:
http-01 challenge for test01.tech-memo.net
Using the webroot path /var/www/test01.tech-memo.net for all unmatched domains.
Waiting for verification...
Challenge failed for domain test01.tech-memo.net
http-01 challenge for test01.tech-memo.net
Cleaning up challenges
Some challenges have failed.
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: test01.tech-memo.net
Type: unauthorized
Detail: Invalid response from
http://test01.tech-memo.net/.well-known/acme-challenge/oitx1M2wHMoe_jDy4FPqECTF-oOVyE55mdSt97Bt_CY
[153.127.43.67]: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML
2.0//EN\">\n<html><head>\n<title>404 Not
Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p"
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
Apacheを停止して再度実行。
service httpd stop
Redirecting to /bin/systemctl stop httpd.service
うまくいった。
certbot certonly --webroot -w /var/www/test01.tech-memo.net -d test01.tech-memo.net
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Requesting a certificate for test01.tech-memo.net
Performing the following challenges:
http-01 challenge for test01.tech-memo.net
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Subscribe to the EFF mailing list (email: webmaster@tech-memo.net).
We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/test01.tech-memo.net/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/test01.tech-memo.net/privkey.pem
Your certificate will expire on 2021-07-28. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again. 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
以下のコマンドで自動更新が行われるか確認し、Apacheを起動。
残りはmod_sslのインストールとApache側の設定。
systemctl status snap.certbot.renew.timer
● snap.certbot.renew.timer - Timer renew for snap application certbot.renew
Loaded: loaded (/etc/systemd/system/snap.certbot.renew.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Thu 2021-04-29 15:10:39 JST; 2h 57min ago
Trigger: Fri 2021-04-30 02:35:00 JST; 8h left
Apr 29 15:10:39 ik1-419-41813.vs.sakura.ne.jp systemd[1]: Started Timer renew for snap application certbot.renew.
systemctl cat snap.certbot.renew.timer
/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-1093.mount
After=var-lib-snapd-snap-certbot-1093.mount
X-Snappy=yes
[Timer]
Unit=snap.certbot.renew.service
OnCalendar=*-*-* 02:35
OnCalendar=*-*-* 16:52
[Install]
WantedBy=timers.target
証明書インストール後のApacheの後処理
443番ポートの起動設定、バーチャルホストの設定と、http→httpsへのリダイレクト設定。
RewriteEngineから下の3行はコメントアウトを解除
# バーチャルホストのSSLの設定以下は追記。
vi /etc/httpd/conf.d/test01.tech-memo.net.conf
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName 153.127.43.67
</VirtualHost>
# バーチャルホストのドメインの設定
<VirtualHost tech-memo.net:80>
DocumentRoot /var/www/test01.tech-memo.net
ServerName test01.tech-memo.net
ServerAdmin webmaster@tech-memo.net
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
# バーチャルホストのSSLの設定
<VirtualHost tech-memo.net:443>
DocumentRoot /var/www/test01.tech-memo.net
ServerName test01.tech-memo.net
ServerAdmin webmaster@tech-memo.net
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/test01.tech-memo.net/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test01.tech-memo.net/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/test01.tech-memo.net/chain.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
</VirtualHost>
<IfModule mime_module>
AddHandler php7-script .php
</IfModule>
apachectl configtest
Syntax OK
service httpd start
備考
最後の設定変更後、Apacheのコンフィグチェックを実施したら、ssl.confの設定がおかしい、自己証明書がない旨のエラーが出力された。
apachectl configtest
AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf:
SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty
なぜか証明書が発行されていない様子だったため、Let’s Encryptの証明書を指定して問題なく起動。
#バックアップ取得
cp -av /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org
#ssl.conf編集
vi /etc/httpd/conf.d/ssl.conf
#差分確認
diff /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org
85c85
< SSLCertificateFile /etc/letsencrypt/live/test01.tech-memo.net/cert.pem
---
> SSLCertificateFile /etc/pki/tls/certs/localhost.crt
93c93
< SSLCertificateKeyFile /etc/letsencrypt/live/test01.tech-memo.net/privkey.pem
---
> SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
次にインストールする環境
WordPressを構築するために、PHP(7.4)をインストールする。
コメント