CentOS8にLet’s Encryptをインストール

無料のDV証明書を発行している認証局のLet’s EncryptでSSL証明書を取得する。

大変簡単に言うと、有料で購入しないといけないドメイン認証(DV)のSSL/TLS証明書を無料で発行している認証局がLet’s Encrypt。

無料のオレオレ証明書で暗号化を設定すると、ブラウザ側でエラー警告が出されてしまう。

とはいえ有料の証明書を購入することは抵抗があるという個人ユーザーには大変ありがたい存在。

証明書の有効期限は 90日。今回の手順でインストールすれば自動更新されるように構築してゆく。

詳細は以下参照。

今回はさくらインターネットのVPSを例にインストール方法を記載。

Let's Encrypt - フリーな SSL/TLS 証明書
Let's Encryptは、非営利団体の Internet Security Research Group (ISRG) が提供する自動化されたフリーでオープンな認証局です。

Let’s Encryptのインストール要件

  • どこかの会社のroot権限が付与されたVPS等Linuxサーバーで作業できること。(rootユーザーで検証したため)
  • 初期構築が完了していること。
  • FQDN(www.tech-memo.netなど)のAレコードの参照先を作業サーバーのグローバルIPに設定済であること。
  • Apache2.4が構築済で、以下の設定が完了していること。
CentOS8にApache2.4インストール
CentOS8にApache2.4インストール
CentOS8インストールと初期構築
サーバーはさくらインターネットのVPSを利用。CentOS8のインストール済ゲストOSを選択。※試用期間はOP25B対応のため実質外部のsmtpと接続できないので要注意。さくらインターネットのVPSで構築こ...

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 インストール

以下サイトを参考にインストール。

CentOS 8 : SSL証明書を取得する(Let's Encrypt) : Server World
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 Encrypt
Let's Encrypt is a free, automated, and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG).
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)をインストールする。

CentOS8にPHP7.4インストール
php7.4インストール

コメント

タイトルとURLをコピーしました