DNS-01方式によるLet's Encrypt自動更新

この記事は さくらインターネット(その2)Advent Calender 2016 16日目のエントリです。

先月からさくらインターネットでアルバイトをさせていただいていて、その関係でアドベントカレンダーを書くことになりました。

たくさんのSSL証明書をLet's Encryptで発行している人や、社内とかローカルでSSL証明書を使っている方は必見のDNS認証方式を利用したLet's encryptの証明書の自動更新化を紹介します。

Let's encryptの認証方式

Let's Encryptは、無料でSSL証明書の発行をしてくれる認証局を用意してくれています。

Let's Encryptで証明書の取得を行うとき、ドメインの認証をするのですがその方式として

  • HTTPによる認証(HTTP-01)
  • DNSによる認証(DNS-01)

の2種類があります。

HTTP-01

HTTPによる認証の手順は以下の通りです。

  1. Let's Encryptに自ドメインの証明書をリクエストする。
  2. Let's Encryptから認証用のトークンとトークンのファイル名が返ってくる。
  3. ドメインからアクセスできるWebサーバの /.well-known 以下に手順2で得られたファイル名でトークンの書き込まれたファイルを作成する。
  4. Let's Encryptに認証チャレンジをリクエストする。
  5. Let's Encryptが /.well-known 以下のトークンファイルにアクセスをして、トークンが正しければ証明書を発行し返す。

メリット

  • 文献がたくさんあって簡単
  • 公式ので自動化とかできる

デメリット

  • ロードバランシングしてる場合、認証が成功するようにいろいろやる必要がある
  • たくさんサーバを運用している場合、めんどくさい
  • 社内向けに使う場合とかでも外部向けのWebサーバを立てないといけない

DNS-01

DNSによる認証の手順は以下の通りです。

  1. Let's Encryptに自ドメインの証明書をリクエストする。
  2. Let's Encryptから認証用のトークンが返ってくる。
  3. DNS_acme-challenge.自ドメイン にトークンをTXTレコードとして登録する。
  4. Let's Encryptに認証チャレンジをリクエストする。
  5. Let's Encryptが _acme-challenge.自ドメイン のTXTレコードを引いて、トークンが正しければ証明書を発行し返す。

メリット

  • Webサーバがどんな状態でも、というかそもそもなくても証明書が発行できる
  • DNS1つで何個も発行できる

デメリット

  • 文献が少なめ
  • 自動化がまだ公式でサポートされてない

DNS-01方式での証明書発行を自動化する

DNS-01方式の恩恵を受けるべく、デメリットである自動化をやってみました。

環境としては、さくらのクラウドDNSサービスを利用しました。

さくらのクラウドとは

さくらインターネットが提供しているクラウドサービスです。

詳細は こちら

DNSサービス

さくらのクラウドを利用すると、APIで無限にいじれるDNSが使えます。(というかほぼ全ての機能がAPI提供してます)

ちなみに月額42円です。

DNS認証なので、証明書を発行するために サーバーを借りる必要はありません。 月42円あれば事足ります。

DNSの使い方に関しては以下を参照してください。

DNS(アプライアンス) | さくらのクラウドニュース

APIを叩くサンプルなどは以下を参照してください。

アプライアンス関連API - さくらのクラウド API v1.1 ドキュメント

前準備

1 . まずドメインを買います。どこで買っても大丈夫です。すでに持ってるやつを使っても大丈夫です。

2 . さくらのクラウドDNSサービスにゾーンを1つ作成します。

f:id:palloc:20161213122039p:plain f:id:palloc:20161213122044p:plain

3 . お名前.comなどでドメインを買った場合、ネームサーバを以下のDNSサーバに変更します。(ドメインを買ったサイト内で変更できるはずです)

f:id:palloc:20161213122048p:plain

4 . ゾーンの中でサブドメインを切り、Aレコードとして自分のサーバーのグローバルIPに割り当てます。 さくらのクラウド上のサーバーを使用している場合は以下のIPで登録してください。

f:id:palloc:20161213122057p:plain

5 . APIキーを発行します。編集権限をつけておいてください。

f:id:palloc:20161213124135p:plain f:id:palloc:20161213124147p:plain f:id:palloc:20161213124159p:plain

実行

証明書を保存しておきたいサーバーで作業をします。

どんなサーバーでも大丈夫です。というか手元のノートPCでokです。

  1. git clone https://github.com/palloc/dehydrated.git
  2. cd dehydrated
  3. python gen_info.py [APIのアクセストークン] [アクセストークンのシークレットキー]
  4. ./letsencrypt.sh -c -d [証明書を発行したいドメイン名] --challenge dns-01 -k ./hook.py

以上で完了です。

これで、 certs/ドメイン名/ 以下に証明書が出来上がっているはずです。

更新するたびに自動で最新の証明書のシンボリックリンクを作成しているので、そいつをコピーして使ってください。

4番目のコマンドのみ定期的に実行すれば、永遠にssl証明書を使えます。

もちろん4番目のコマンドの引数のドメイン名を変更すれば、他のドメインの証明書が発行できるので無限にコマンド一つでssl証明書を発行させることもできます。

まとめ

DNS方式でのLet's Encrypt自動更新はどのPCからコマンドを実行しても大丈夫というのが最大の利点だと思っています。

アルバイト先のサービスだから贔屓するわけではないのですが、さくらのクラウドDNSはすごくDNS認証と相性が良いです。とても簡単にLet's Encryptの自動更新ができるようになるため、是非使ってみてください。

料金は1ゾーンあたり42円で、よく配ってる2万円クーポンを使ったら39年使えます。18歳の学生の方が使い始めたら57歳まで使えますね。

さくらのクラウド自体もVPCルータとスイッチ立ててクラウド上のローカルネットワークを作れたりするので遊んでみてください!