Let's Encryptで無料SSLをCentOS7に設定(certbot)

ssl2016年4月に正式サービスが開始された無料SSL「Let's Encrypt」を開発用仮想マシンに設定したときの覚書。

環境:CentOS 7.2.1511, nginx 1.10.1

仕組みを理解しながら公式サイトのGetting Startedにある通りcertbotをインストールしてみる。

 

目次

  1. certbotインストール
  2. SSL証明書取得
  3. nginxに設定して動作確認
  4. SSL証明書の更新をcronに設定
  5. 制限事項を確認

 


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 >