BeProud Advent Calender 2018 15日目の記事です。
仕事でサーバーにSSL証明書を入れる機会があった。
できればワイルドカード証明書使いたい、という気持ちがあった。そこで、手軽に使えてワイルドカード証明書にも対応しているというLet's Encryptを採用。
Let's Encryptのクライアントならワイルドカード証明書が取得できる、そう思っていた時期がありました(´・ω・`)
環境
OS: Ubuntu 16.04
Webサーバ: nginx
オーケストレーションツールとしてansibleを使っている
tl;dr
Ubuntu 16.04では
certbot
ではなくletsencrypt
をインストールするのが楽。ただし
letsencrypt
ではワイルドカード証明書は使えない
certbotではなくletsencrypt
Let's Encryptユーザーガイドを見ると、certbot
コマンドを使っているが、Ubuntu 16.04ではletsencrypt
コマンドを使う。
インストール方法: Ubuntu 16.04 (xenial)に従って、
sudo apt-get install letsencrypt python-letsencrypt-apache
とするだけでいい。apacheプラグインが不要な場合は python-letsencrypt-apache
は省略する。
Ubuntu 16.04にインストールする方法はあるが、リポジトリを追加する必要がある。
オーケストレーションの際にリポジトリを追加する手間が増えるので、今回は採用しなかった。ワイルドカード証明書は必須の要件ではなかったし。
ワイルドカード証明書
ワイルド証明書とは、一枚の証明書で同じドメインに属しているサブドメインのSSL化ができる証明書のこと。
証明書を取得する際に、*.example.com
のようにドメイン名の左側にアスタリスクをつける。
ワイルドカード証明書を取得するには、Let's Encrypt
のパッケージがACME v2 API
に対応していなければいけない。ACMEとは証明書発行のプロトコルのこと。
参考: Let's Encrypt を支える ACME プロトコル - Block Rockin’ Codes
Let's Encryptでのワイルドカード証明書取得については以下が詳しい。
ACME v2 とワイルドカード証明書の技術情報 - Let's Encrypt 総合ポータル
ワイルドカード証明書と ACME v2 へ対応 - Let's Encrypt 総合ポータル
ACME v2 APIに対応したクライアントは、ACME Client Implementations - Let's Encrypt - Free SSL/TLS Certificatesで一覧できる。そしてここにletsencryptの名前はない。
サーバ証明書の取得
Webサーバが動作している環境では、webroot
プラグインを使う。
$ letsencrypt certonly --webroot {webroot-path} -d certificated.example.com
{webroot-path}
はWebサーバのドキュメントルートディレクトリ。
Webアプリが/home/www/myapp/
であれば、{webroot-path}
は/home/www/myapp/
になる。
このコマンドを実行すると{webroot-path}/.well-known/acme-challenge
にワンタイムトークンが作られる。Let's Encryptの認証サーバーがexample.com/.well-known/acme-challenge/{token}
に対してHTTPリクエストすることで、ドメインの認証を行う仕組みになっている。
今回の案件ではドキュメントルートディレクトリではなく/home/www/letencrypt/
を指定した。
この場合、HTTP通信(80番ポート)を通したcertificated.example.com
へのリクエストに対して、/home/www/letencrypt/
をマッピングしておく。
# /etc/nginx/nginx.conf server { listen 80; server_name certificated.example.com; location / { root /home/www/letsencrypt; } }
コマンドを実行するとどうなる?
過去に証明書を取得したことがない場合は、鍵の紛失時の連絡や期限切れ通知に使うメールアドレスを入力するTUIが起動する。メールアドレスを入力すると利用規約への同意が求められる。これも初回のみ。
nginxにSSL通信の設定をする
サーバ証明書が取得できたので、nginxの設定をしていく。
サーバ証明書・秘密鍵は/etc/letsencrypt/live/{ドメイン名}
に置かれている。
# /etc/nginx/nginx.conf server { listen 443; server_name certificated.example.com ssl on; ssl_certificate /etc/letsencrypt/live/certificated.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/certificated.example.com/privkey.pem; location / { . . . } } server { listen 80; server_name certificated.example.com; location / { root /home/www/letsencrypt; } }