ApacheでSSL設定を行う【CentOS7/Let's Encrypt】
CentOS 7とApache 2.4、Lets Encryptを用いてSSL設定を行ったのでそのまとめ。
ApacheのVirtual Hostを最低限設定
最初に最低限の設定を/etc/httpd/conf.d/vhost.conf
に対して行い、SSL化したいサイトをHTTPでアクセスできる状態にしておく。vhost.confは最初作成されていないので作成する。https://httpd.apache.org/docs/2.4/ja/vhosts/examples.html
を参考に設定して欲しい。
# 余計なアクセスを遮断する
<VirtualHost _default_:*>
DocumentRoot /www/default
</VirtualHost>
# dist以下にhtmlファイルをおいておく
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example/dist/
</VirtualHost>
これでまずはHTTPのアクセスが行える。
Let's EncryptでHTTPS化する
Certbotの指示に従っていく。
epelを加えるepelはExtra Packages for Enterprize Linuxの略でこれを入れることでinstallできるyum packageが増えると考えてもらえば良い。
$ sudo yum install epel-release
snapdパッケージをインストール+事前準備+最新versionをインストールしているかのチェック。
$ sudo yum install snapd
$ sudo systemctl enable --now snapd.socket
$ sudo ln -s /var/lib/snapd/snap /snap
$ sudo snap install core; sudo snap refresh core
以前のcertbotを入れていたら、uninstallしておく。取り敢えず、インストールしているかどうか怪しい場合は一回叩いておけばよい。
$ sudo yum remove certbot
No match for argument: certbot
No packages marked for removal.
Dependencies resolved.
Nothing to do.
Complete!
次にcertbotをインストールする
$ sudo snap install --classic certbot
certbot稼働を確実にするためにsymlinkを張る
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot起動
$ sudo certbot --apache
...
Could not find ssl_module; not installing certificate.
何故かエラーが出た。
mod_sslが無いとのことなのでインストール
$ sudo yum -y install mod_ssl
これで/etc/httpd/conf.modules.d
以下に00-ssl.conf
というファイルが出来上がる。また、中途半端に失敗してしまったので、conf.d
以下に生成されるssl.conf
は削除しておく。
再度certbot起動すると成功。
$ sudo certbot --apache
Created an SSL vhost at /etc/httpd/conf.d/vhost-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/conf.d/vhost-le-ssl.conf
Error while running apachectl graceful.
Job for httpd.service failed because a fatal signal was delivered causing the control process to dump core.
See "systemctl status httpd.service" and "journalctl -xe" for details.
Unable to restart apache using ['apachectl', 'graceful']
Redirecting vhost in /etc/httpd/conf.d/vhost.conf to ssl vhost in /etc/httpd/conf.d/vhost-le-ssl.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
これでホームページにアクセスすると、https化されている事が確認できる。
sslの更新は自動的にセットされているようで、私の場合は下記で確認できた。
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sat 2021-03-20 20:21:49 JST 21min left Sat 2021-03-20 19:21:46 JST 38min ago dnf-makecache.timer dnf-makecac>Sun 2021-03-21 00:00:00 JST 3h 59min left Sat 2021-03-20 00:00:03 JST 20h ago unbound-anchor.timer unbound-anc>Sun 2021-03-21 00:54:46 JST 4h 54min left Sat 2021-03-20 00:54:46 JST 19h ago systemd-tmpfiles-clean.timer systemd-tmp>Sun 2021-03-21 05:03:00 JST 9h left n/a
n/a snap.certbot.renew.timer snap.certbo>
4 timers listed
実際に更新時に正しくcertが更新されるかはdry-runを実行して成功しているかを確認しておけばよい。
sudo certbot renew --dry-run
Congratuations, all simulated renewals succeededと表示されれば設定がうまく行っているであろう。
(過去の方法) Let's EncryptでHTTPS化する
下記の記事は2020年8月時点の記事である。昔の設定方法であるが備忘録として残しておく。
Certbotの指示に従っていく。
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install certbot python2-certbot-apache
必要なパッケージをインストールしたら、certbotを起動する
$ sudo certbot --apache
途中HTTPS化をどのURLに対して行うべきか?ということを聞かれるので答える。
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example.com
2: www.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/conf.d/vhost-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/conf.d/vhost-le-ssl.conf
Redirecting vhost in /etc/httpd/conf.d/vhost.conf to ssl vhost in /etc/httpd/conf.d/vhost-le-ssl.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本的にはURLが短い1が良いだろう。vhost-le-ssl.conf
というファイルが作成されている事がわかる。
最後にhttps化の期限が来たら自動的に更新してくれるようにする。
$ echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
これにより定期的に更新を見張っていてくれる。etc/crontab
を開くと正しく設定されていることがわかる。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q
結果を確認
vhost.conf
<VirtualHost _default_:*>
DocumentRoot /www/default
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example/dist/
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Redirect設定がされていることが分かる。
次にvhost-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example/dist/
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>
</IfModule>
あとはsystemctl restart httpd
で再起動すればhttpsでアクセスできる