Let's Encryptで無料SSLをCentOS7に設定(certbot)
2016年4月に正式サービスが開始された無料SSL「Let's Encrypt」を開発用仮想マシンに設定したときの覚書。
環境:CentOS 7.2.1511, nginx 1.10.1
仕組みを理解しながら公式サイトのGetting Startedにある通りcertbotをインストールしてみる。
目次
- certbotインストール
- SSL証明書取得
- nginxに設定して動作確認
- SSL証明書の更新をcronに設定
- 制限事項を確認
1.certbotインストール
certbotは鍵の生成、署名要求、署名済み証明書取得を自動化してくれるクライアントツール。
certbot公式サイトでOSとWebサーバーを選択するとインストール方法が表示される。
# yum install epel-release
# yum install certbot
確認
# certbot --version
certbot 0.8.1
2.SSL証明書取得
certonlyオプションだけを付けて実行すると、SSL証明書取得に必要なことを対話形式で進めることが出来る。
# certbot certonly
「webroot」プラグインは公開しているディレクトリを選択すると、そこに「.well-known」ディレクトリを作って存在確認を自動化してくれる。
開発用サーバーがLAN内にある場合はルーターのポートマッピング設定を忘れずに(httpの80番ポート)。
外から指定したドメインが確認できないと「403 Forbidden」のエラーメッセージが表示される。
次からはコマンドで実行
# certbot certonly --webroot -w /var/www/example -d dev.example.com
Domain: dev.example.com
Type: unauthorized
Detail: Invalid response from
http://dev.example.com/.well-known/acme-challenge/TxubayuV_1gfQMVmmoi8RYvZQkLyLDrBy9TLPQaGjoE:
"<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>"
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A record(s) for that domain
contain(s) the right IP address.
DNSの設定とポートマッピングは問題なかったけど、nginxの設定で「.(ドット)」から始まるアドレスは許可してなかった。
下記issueを参考に.well-knownだけ許可するように設定変更
nginxの設定ファイルを変更。アクセス制限関連は共通ファイルにしてあったので変更も楽ちん(ドヤ顔)
# cd /etc/nginx/conf.d/global/
# less wordpress_restrictions.conf
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
deny all;
}# Accept for Let's Encrypt(certbot)
location ^~ /.well-known/ {
access_log off;
log_not_found off;
autoindex off;
try_files $uri $uri/ =404;
}
nginx設定ファイルはGistにアップしてあるので、そちらも参考に
configtestして再読み込み
# nginx -t
# systemctl reload nginx
もう一度SSL証明書取得
# certbot certonly --webroot -w /var/www/example -d dev.example.com
「/etc/letsencrypt/live/」に署名済み証明書のシンボリックリンクが保存される。実体は「/etc/letsencrypt/archive/」
参考:Let's Encrypt の使い方 - Let's Encrypt 総合ポータル
cert.pem | 署名済み証明書 (公開鍵) |
chain.pem | 中間証明書 |
fullchain.pem | 署名済み証明書+中間証明書 |
privkey.pem | 秘密鍵 (パスフレーズなし) |
取得後は「.well-known」ディレクトリの中身は自動で削除される。
3.nginxに設定して動作確認
SSL証明書をnginxに設定
# cd /etc/nginx/conf.d/
# less 01_example.conf
前の記事を参考に。
#
# SSL
#
ssl on;
ssl_certificate /etc/letsencrypt/live/dev.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dev.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
configtestして再読み込み
# nginx -t
# systemctl reload nginx
WordPressのデータを全部ダンプしてhttp://dev.example.comをhttps://dev.example.comに置換してインポート。
ブラウザで表示できるか確認
4.SSL証明書の更新をcronに設定
取得した証明書は90日間しか有効期限がないので、定期的に更新する必要がある。
certbot renewコマンドを実行するだけで有効期限が30日未満の証明書のみ更新してくれる。
とりあえず実行してみる
# certbot renew
さっき作ったのはまだ更新しないと表示される。
毎日チェックするためにcronに登録
# cd /etc/cron.d
# vi certbot
MAILTO=""
# Check ssl certificates at 5am
0 5 * * * root /usr/local/bin/certbot renew && /bin/systemctl reload nginx
60日後に更新されているか確認する予定。
certbotの場所が分からないときはwhichコマンド
(dnfでインストールしたときとpipでアップデートしたときで場所が変わる)
# which certbot
5.制限事項を確認
1週間に更新できる証明書は20個/1ドメイン。
certbot renewで更新する限りは制限にまず引っかかることはない。
期限が迫ってきて更新されていないと初回登録したメールアドレス宛てに通知してくれるらしい。
< Related Posts >