蛇ノ目の記

技術のことも。そうでないことも。

Ubuntu 16.04でLet's Encryptを使ってサーバ証明書を取得する

BeProud Advent Calender 2018 15日目の記事です。

adventar.org

仕事でサーバーにSSL証明書を入れる機会があった。

できればワイルドカード証明書使いたい、という気持ちがあった。そこで、手軽に使えてワイルドカード証明書にも対応しているというLet's Encryptを採用。

Let's Encryptのクライアントならワイルドカード証明書が取得できる、そう思っていた時期がありました(´・ω・`)

環境

tl;dr

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にインストールする方法はあるが、リポジトリを追加する必要がある。

www.digitalocean.com

オーケストレーションの際にリポジトリを追加する手間が増えるので、今回は採用しなかった。ワイルドカード証明書は必須の要件ではなかったし。

ワイルドカード証明書

ワイルド証明書とは、一枚の証明書で同じドメインに属しているサブドメインSSL化ができる証明書のこと。

証明書を取得する際に、*.example.comのようにドメイン名の左側にアスタリスクをつける。

参考: ワイルドカード証明書について | JPRS

ワイルドカード証明書を取得するには、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;
    }
}