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で証明書の取得を行うとき、ドメインの認証をするのですがその方式として
の2種類があります。
HTTP-01
HTTPによる認証の手順は以下の通りです。
- Let's Encryptに自ドメインの証明書をリクエストする。
- Let's Encryptから認証用のトークンとトークンのファイル名が返ってくる。
- 自ドメインからアクセスできるWebサーバの
/.well-known
以下に手順2で得られたファイル名でトークンの書き込まれたファイルを作成する。 - Let's Encryptに認証チャレンジをリクエストする。
- Let's Encryptが
/.well-known
以下のトークンファイルにアクセスをして、トークンが正しければ証明書を発行し返す。
メリット
- 文献がたくさんあって簡単
- 公式ので自動化とかできる
デメリット
- ロードバランシングしてる場合、認証が成功するようにいろいろやる必要がある
- たくさんサーバを運用している場合、めんどくさい
- 社内向けに使う場合とかでも外部向けのWebサーバを立てないといけない
DNS-01
DNSによる認証の手順は以下の通りです。
- Let's Encryptに自ドメインの証明書をリクエストする。
- Let's Encryptから認証用のトークンが返ってくる。
- DNSの
_acme-challenge.自ドメイン
にトークンをTXTレコードとして登録する。 - Let's Encryptに認証チャレンジをリクエストする。
- Let's Encryptが
_acme-challenge.自ドメイン
のTXTレコードを引いて、トークンが正しければ証明書を発行し返す。
メリット
- Webサーバがどんな状態でも、というかそもそもなくても証明書が発行できる
- DNS1つで何個も発行できる
デメリット
- 文献が少なめ
- 自動化がまだ公式でサポートされてない
DNS-01方式での証明書発行を自動化する
DNS-01方式の恩恵を受けるべく、デメリットである自動化をやってみました。
環境としては、さくらのクラウドのDNSサービスを利用しました。
さくらのクラウドとは
さくらインターネットが提供しているクラウドサービスです。
詳細は こちら
DNSサービス
さくらのクラウドを利用すると、APIで無限にいじれるDNSが使えます。(というかほぼ全ての機能がAPI提供してます)
ちなみに月額42円です。
DNS認証なので、証明書を発行するために サーバーを借りる必要はありません。 月42円あれば事足ります。
DNSの使い方に関しては以下を参照してください。
APIを叩くサンプルなどは以下を参照してください。
アプライアンス関連API - さくらのクラウド API v1.1 ドキュメント
前準備
1 . まずドメインを買います。どこで買っても大丈夫です。すでに持ってるやつを使っても大丈夫です。
2 . さくらのクラウドのDNSサービスにゾーンを1つ作成します。
3 . お名前.comなどでドメインを買った場合、ネームサーバを以下のDNSサーバに変更します。(ドメインを買ったサイト内で変更できるはずです)
4 . ゾーンの中でサブドメインを切り、Aレコードとして自分のサーバーのグローバルIPに割り当てます。 さくらのクラウド上のサーバーを使用している場合は以下のIPで登録してください。
5 . APIキーを発行します。編集権限をつけておいてください。
実行
証明書を保存しておきたいサーバーで作業をします。
どんなサーバーでも大丈夫です。というか手元のノートPCでokです。
git clone https://github.com/palloc/dehydrated.git
cd dehydrated
python gen_info.py [APIのアクセストークン] [アクセストークンのシークレットキー]
./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ルータとスイッチ立ててクラウド上のローカルネットワークを作れたりするので遊んでみてください!