0.前書き
公開ウェブサーバ用のTLS(SSL)化を行うことにした。
証明書はLets Encryptを使用し、Qualys SSL Labsのテストで高得点を
取ることを目標とする。
1.前提条件
・CentOS7であること
・ドメインを取得していること
・取得したドメインに紐づいた公開ウェブサーバがあり、
インターネット上での名前解決が可能であること
・httpがTCP/80、httpsがTCP/443で待ち受けている
・Apache/2.4.6でWordPressを使用している
2.証明書の発行
本来、TLS(SSL)サーバ証明書は秘密鍵とCSRを作成し、
そのCSRに認証局の署名をしてもらうことで発行される。
Lets Encryptでは、そのすべてが「certbot」というソフトで自動化されており、
証明書の自動更新もこのソフトで行う。
そのため、まず「certbot」のインストールが必要だが、
「certbot」のインストールは「EPELリポジトリ」から行うため、
EPELリポジトリのインストールが必要(すでにあれば無視してください。)
sudo yum -y install epel-release
続いて、「certbot」のインストール
sudo yum -y install certbot
Apacheのドキュメントルートを設定するため、ドキュメントルートのパスを調べる。
sudo cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
以下コマンドで証明書を発行する。
※それぞれ環境に合わせて、書き換えてください
sudo certbot certonly –webroot \
-w /home/www/html \
-d miyamo83.com \
-d www.miyamo83.com \
-m example@gmail.com \
–agree-tos -n
-w ドキュメントルート指定
-d ドメイン指定 今回はwww有り無し2パターン
-m 管理用メールアドレスの登録
–agree-tos 規約に承諾 利用規約は「https://letsencrypt.org/repository/」
-n 対話を表示させない 対話が必須の場合削除する必要あり
なお、以下のエラーが出る場合、指定ドメインの名前解決ができていない可能性あり。
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA. You may need to use an authenticator plugin that can do challenges over DNS.
成功例
sudo certbot certonly –webroot \
> -w /home/www/html \
> -d miyamo83.com \
> -d www.miyamo83.com \
> -m example@gmail.com \
> –agree-tos -n
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Requesting a certificate for miyamo83.com and www.miyamo83.com
Performing the following challenges:
http-01 challenge for miyamo83.com
http-01 challenge for www.miyamo83.com
Using the webroot path /home/www/html for all unmatched domains.
Waiting for verification…
Cleaning up challenges
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/miyamo83.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/miyamo83.com/privkey.pem
Your certificate will expire on 2022-07-22. 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:
証明書のファルダを確認し、
4つのファイルが作成されていればOK
-rw-r–r– 1 root root 692 4月 23 15:38 README
lrwxrwxrwx 1 root root 36 4月 23 15:38 cert.pem -> ../../archive/miyamo83.com/cert1.pem
lrwxrwxrwx 1 root root 37 4月 23 15:38 chain.pem -> ../../archive/miyamo83.com/chain1.pem
lrwxrwxrwx 1 root root 41 4月 23 15:38 fullchain.pem -> ../../archive/miyamo83.com/fullchain1.pem
lrwxrwxrwx 1 root root 39 4月 23 15:38 privkey.pem -> ../../archive/miyamo83.com/privkey1.pem
3.Apacheでの設定
ApacheでTLS(SSL)化を行うにあたって、
「mod_ssl」というモジュールが必要になるため、インストールする。
sudo yum -y install mod_ssl
Apacheの構成定義ファイルでバーチャルホストの設定を行う。
※バーチャルホストの設定は「ssl.conf」に記載する方法や、
バーチャルホストごとにファイルを分ける方法があるが、
今回は「httpd.conf」に集約する。
sudo vi /etc/httpd/conf/httpd.conf
編集内容
※環境に合わせて、書き換えてください
変更箇所
Listen 443 → #Listen 443 (なければ無視)
#ServerName www.example.com:80 → ServerName miyamo83.com:443
最終行に以下を追記
#以下バーチャルホストの設定
<VirtualHost *:443>
#サーバ名
ServerName miyamo83.com:443
#ドキュメントルート指定
DocumentRoot “/home/www/html”
#SSL有効化
SSLEngine on
#サーバが提供する暗号化スイートを優先的に使用するようにする
SSLHonorCipherOrder on
#HTTPの代わりにHTTPSを使用させる。サブドメインにも適用
Header set Strict-Transport-Security “max-age=31536000; includeSubDomains”
#TLSv1.2以外を無効
SSLProtocol -All +TLSv1.2
#暗号化スイートの中からaNULL、MD5、SEED、IDEA、3DES、RC4、DHを無効
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!3DES:!RC4:!DH
#証明書の場所
SSLCertificateFile /etc/letsencrypt/live/miyamo83.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/miyamo83.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/miyamo83.com/chain.pem
#オプション設定
<Directory “/home/www/html/miyamo83.com”>
#フォルダ内のリダイレクト許可
Options FollowSymLinks
#.htaccess有効化
AllowOverride All
# ファイル一覧出力の禁止
Options -Indexes
</Directory>
#エラーログ出力
ErrorLog logs/error_log
#アクセスログ出力
CustomLog logs/access_log combined env=!nolog
</VirtualHost>
暗号スイートの説明は以下を参照
編集したファイルの構文チェックを行う。
sudo apachectl configtest
Syntax OKが表示されればOK
次に、先ほどインストールした「mod ssl」の構成定義ファイルを編集する。
sudo vi /etc/httpd/conf.d/ssl.conf
編集内容
##
## SSL Virtual Host Context
##
この3行から下をすべて削除する。
最終行に下記を追加する。
#443の通信はhttpd.confのVirtualHostを参照
NameVirtualHost *:443
httpdサービスを再起動する。
sudo systemctl reload httpd
4.WordPressでサイトの設定
wordpressの管理画面で「設定」メニューの「一般設定」に
ある「サイトアドレス (URL)」をhttpsから始まるURLに変更する。
サイトにアクセスし、暗号化通信に成功しているか確認
うまくいった場合、以下のようになる。
5.Qualys SSL Labsでテスト
以下のサイトにアクセスし、自ドメインのセキュリティチェックを行う。
評価はA+なので今回の目標としては達成とする。
TLSv1.3への対応は超えるハードルが多いため、今回は見送った。
6.証明書の自動更新
Lets Encryptは無料のサービスであるためか、
証明書の有効期限が90日となっている。
そのため、毎月1日の朝5時に証明書の自動更新を行う設定をする。
まず、以下のコマンドで証明書の手動更新が可能か確認する。
/bin/certbot renew –force-renewal && /bin/systemctl reload httpd
更新が完了したら証明書を見に行き、更新されているか確認する。
※環境に合わせて、書き換えてください
ll /etc/letsencrypt/live/miyamo83.com/
ファイルの日時が更新されていればOK
クーロン設定を行う。
crontab -e
編集内容
0 5 1 * * /bin/certbot renew –force-renewal && /bin/systemctl reload httpd
これですべての作業が完了となります。
コメント