legoでLet's encryptのSSL証明書をDNS-01方式で取得する

インフラストラクチャ

Conoha VPSでAnsibleを使ってLet's EncryptのSSL証明書の取得を行おうとしていた。

証明書の取得はDNS-01方式(ドメインのTXTレコードに認証局が発行したワンタイムトークンを登録して検証する)で取得したかったので、ConohaのAPIを使って、TXTレコードを登録、削除するようなスクリプトを組んで対応(cf. github.com - k2snow/letsencrypt-dns-conoha)していたが、スクリプトの管理が面倒だったので、もっと単純なやり方を模索していたところ、go-acme/legoというLets' Encryptのクライアントツールを見つけたので使ってみた。

go-acme/lego

legoはGo製のLets't Encryptクライアント&ACMEのライブラリ。

Conoha以外にも様々なDNS Providersが用意されている。

インストールはdockerでもパッケージマネージャーでもGoでも良い。

legoでLets' EncryptのSSL証明書を取得

dockerを使う場合のコマンドはこんな感じ(Ansibleのコードそのまま持ってきた)。

docker run --rm -e CONOHA_POLLING_INTERVAL=30 -e CONOHA_PROPAGATION_TIMEOUT=3600 -e CONOHA_TTL=3600 -e CONOHA_REGION={{ conoha_region }} -e CONOHA_TENANT_ID={{ conoha_tenant_id }} -e CONOHA_API_USERNAME={{ conoha_username }} -e CONOHA_API_PASSWORD={{ conoha_password }} -v /home/{{ ssh_user_name }}/lego:/lego goacme/lego --path /lego --email {{ email }} --dns conoha --domains *.{{ domain }} --domains {{ domain }} --accept-tos run

ConohaのDNSはTXTレコードの反映が遅い?か何かあるらしく、デフォルトの設定ではtimeoutのエラーを吐くので、CONOHA_PROPAGATION_TIMEOUTCONOHA_PROPAGATION_TIMEOUTCONOHA_TTLは設定値を上記のようにセットしたほうが良い。

スクリプトで対応していたときもDNSの挙動にハマって上手く行かないことが多かった。なぜだろう..

所感

すごい楽。証明書の更新もlegoでOK。