Let's Encrypt で SSL 証明書取得

Published: 2016-02-15 13:30 +0900 by Chirimen

Let’s Encrypt で SSL 証明書を取得するまでのメモ

作業内容

クライアントのインストール

適当なディレクトリ (作業用) で以下のコマンドを実行する。

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt

Let’s Encrypt クライアントをインストールする、 の前に CentOS 6 の場合はあらかじめ EPEL リポジトリを有効にしておく必要があった。

$ sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

Let’s Encrypt クライアントをインストールする。

$ ./letsencrypt-auto

なんか ~/.local/share/letsencrypt にインストールされた、 けどこのあとも ./letencrypt-auto を実行するのでいいらしい。

SSL 証明書の取得

コマンドは ./letsencrypt-auto certonly で、 稼働中の Web サーバがある場合にはプラグイン指定オプション --webroot をつける。 そうするとドメイン使用権者認証が Web サーバに置いたファイルに アクセスする方式となる (認証ファイルを設置するのは自動)。

テストサーバからテスト用の証明書を取得する

本番前にまずはテスト。

オプション --test-cert をつけるとテスト用の証明書を取得する (テスト証明書配布用のサーバに接続するらしい)。 本番証明書の取得は回数制限があるそうなので、 手順が飲み込めるまではテスト証明書で練習しておく。

$ ./letsencrypt-auto certonly --webroot --test-cert -w (ドキュメントルート) -d (ドメイン)

実行すると /etc/letsencrypt/live/(ドメイン) の中に privkey.pem, fullchain.pem, chain.pem, cert.pem が作成された。 これらはシンボリックリンクで、 実体は /etc/letsencrypt/archive/(ドメイン) に置かれている。 ディレクトリは root のみアクセス可能。 一般ユーザで実行したから内部で sudo か何かを実行しているのだろう。

名称から容易に想像がつくが、privkey.pem が秘密鍵、他は証明書だ。 Apache なら秘密鍵 privkey.pem と 全部入りの証明書 fullchain.pem を使うのでよい。

SSLCertificateKeyFile /etc/letsencrypt/live/(ドメイン)/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/(ドメイン)/fullchain.pem

Apache に graceful start で新しい SSL 設定を読ませる。

$ sudo apachectl graceful

実際は CentOS 6 の SCL リポジトリの Apache24 をインストールしているので 以下のコマンドを打っている。

$ sudo scl enable httpd24 'apachectl graceful' 

これで取得した証明書を使って https で接続できるわけだが、 テスト用の証明書なのでブラウザに読ませると不正な証明書扱いになる。 ちなみに issuer は happy hacker fake CA となっている。

$ sudo openssl x509 -in cert.pem -noout -issuer
issuer= /CN=happy hacker fake CA

本番証明書を取得する

いよいよ本番証明書の取得である。

最終的には証明書取得のプロセスを自動化しないといけないので、 対話的な操作が不要な手順を確認しておく。

オプション -n は対話的な問い合わせを行わない指定 (--no-interractive)。 オプション --aggree-tos は Let’s Encrypt のサービス利用規約 (terms of service) に同意する指定。

$ ./letsencrypt-auto certonly --webroot -w (ドキュメントルート) -d (ドメイン) -m (メールアドレス) -n --agree-tos

この指定でいけるかと思ったのだが、 さっき取得したテスト証明書があったので更新扱いになるようだ。 なので強制更新するオプション --force-renewal も指定する。

$ ./letsencrypt-auto certonly --webroot -w (ドキュメントルート) -d (ドメイン) -m (メールアドレス) -n --agree-tos --force-renewal
$ sudo scl enable httpd24 'apachectl graceful'

実運用のときはオプション --keep で期限切れが近いときだけ 更新してくれるようだが、 具体的に何日前から更新してくれるのかが不明。 10 日だといってる人も 30 日だという人もいる。 それによって cron で回す頻度が変わると思うんだけど。

毎日が前提?

参考

Share

Latest Posts

Django Rest Framework のテストでハマったこと (4)

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

Django Rest Framework のテストでハマったこと (3)

factory_boy の Faker() で、 取得した値を加工してから使用する話。

Django Rest Framework のテストでハマったこと (2)

Django のテスト用データを作成するのによく用いられる factory_boy で locale を指定して日本語圏用のデータを利用する話。