CertbotでDNSによる認証(DNS-01)で無料のSSL/TLS証明書を取得する

投稿者: | 2017/04/19


Certbot(旧Let’s Encrypt)は無料でSSL/TLS証明書を発行できる認証局(CA)です。有効期限が90日(約3ヶ月)と短いですが、コマンドによる自動化が可能で定期的に実行することで常に証明書を更新し続けることができます。

証明書を取得するにあたり、ドメインを自分で管理しているかの認証方式が以下の三つがサポートされています。

  • HTTP-01
    Let’s Encryptの認証局からワンタイムトークンを発行してもらい、Webサーバに認証用ファイルを設置する。
    認証局からHTTP(80番ポート)でアクセスしてもらい、ワンタイムトークンと認証用ファイルとの妥当性を検証する。

  • TLS-SNI-01
    HTTP-01と同じ方法だが、HTTPS(443ポート)を使用する。

  • DNS-01
    Let’s Encryptの認証局から発行してもらったワンタイムトークンを対象ドメインのTXTレコードに登録することで検証する。

アクセスが制限されているサーバに対して証明書を取得する場合はDNS-01方式を採用したいと考えるはずです。
Certbotコマンドで今までできなかったため、サードパーティ製のスクリプトであるdehydrated(旧letsencrypt.sh)を使っていましたが、v0.9.0からCertbotでもサポートされるようになりました。

https://github.com/certbot/certbot/pull/2061
https://github.com/certbot/certbot/milestone/22

そこで、CertbotでDNS-01方式によるSSL/TLS証明書を取得する方法をご紹介します。

実行環境

  • CentOS 7.2.1511
  • 対象ドメイン: jicoman.info

Certbotのインストール

epelリポジトリを持ってきてYumでインストールします。

手動による証明書の取得

初回のみ手動で行います。
コマンドのオプションなどはドキュメントをご参照ください。

ここで上記のようなワンタイムトークンが発行されますので、_acme-challenge.<対象ドメイン> (今回は_acme-challenge.jicoman.info)のTXTレコードにワンタイムトークンを登録してください。
登録後、エンターを押すと再開します。レコード登録後すぐだと反映されていないので少し待ちましょう。
成功すると以下のように表示されます。

証明書の確認

取得した証明書を見てみます。
証明書が更新されて取得する度に、ファイル名の数字がインクリメントされたファイルが生成されます。
例えば、次に更新された場合は、xxx2.pem が新たに生成されます。

しかし、これだと更新の度にWebサーバ(Apache, nginxなど)の設定を書き換えなければならず大変面倒です。
そこで次の証明書を見てみましょう。

シンボリックリンクが張られていることがわかります。
新たな証明書が取得される度にシンボリックリンクの向き先を更新してくれるため、ApacheやNginxの設定ではこちらのパスを指定することで、更新されたとしても設定を変更しなくても済みます。

次に証明書の妥当性を確認します。

OKと出ているので妥当性は問題なさそうです。

証明書の取得の自動化

二回目以降は自動的に証明書を更新することができます。

フックスクリプト

dehydrated(旧letsencrypt.sh)の場合と同様に認証チャレンジするフックスクリプトを用意する必要があります。DNSサービスはRoute53を利用しているため、Route53と連携しているスクリプト(Python製)を使用することにします。

Route53へレコード登録・削除するAWSアクセス権限を設定

EC2インスタンスであればIAMロール、そうでなければAWSアクセスキーを発行します。
IAMポリシーは AmazonRoute53DomainsFullAccess ポリシーをアタッチしてください。

AWS CLIのインストールと設定を行います。

実行

先ほど手動で取得した場合といくつかオプションが異なっています。
--renew-by-default を指定しているため、既存の証明書の期限関係なく証明書を更新します。
実行すると以下のような実行結果になります。

生成されたファイル群を見ても更新されていることがわかります。

定期的に実行する場合

Cronなどで定期的に実行し、期限が近づいたら更新するようにします。

--keep-until-expiring オプションを指定することで、現証明書の有効期限が近づくまでは更新しません。

最後に

CertbotでDNS-01方式によるSSL/TLS証明書を手動・自動・定期実行で取得する方法を紹介しました。
Certbotはオプションがかなり多いですが、ドキュメントを見ながらやれば想像以上に簡単にできます。
無料でSSL/TLS証明書が使えるので個人サービスを持っている人はぜひ導入を検討した方がよいかと思います。

更新がきたらSlack通知したり、WindowsのIIS対応などは別記事で書こうと思います。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*