無料でSSL証明書の発行ができる Let’s Encrypt が Public Beta となり、これからどんどん利用されていくと思われますが、公式(?)のツール https://github.com/letsencrypt/letsencrypt はちょっと使いにくいところがありました。
DigitalOcean にも解説記事 How To Secure Nginx with Let’s Encrypt on CentOS 7 がありましたが、あのツールでは HTTP でのドメイン認証となり、証明書を取得しようとしているドメイン(FQDN)が外部 (Let’s Encrypt 側のサーバー) からアクセス可能状態でなければなりません。
外部に公開していない、できないサーバーであったり、ロードバランサーの背後にあったり、Web じゃなくてメールサーバーとか LDAP サーバーで使いたいのにという場合に不便でした。
そんななか sorah さんが Acmesmith という便利ツールを公開されていたので早速試してみることにしました。
ACME Protocol では HTTP でのドメイン確認の他に DNS の TXT レコードを使う方法も規定されています。Acmesmith はこの DNS での処理を AWS Route53 を使うことによってレコードの追加削除まで自動で行ってくれるツールとなっています。さらに、鍵と証明書を S3 に保存することも、それを KMS によってセキュアに管理することにも対応しています。
今回はまずローカルファイルに証明書を書き出す方法でやってみます。
使い方は README に書いてありますね。
Ruby gems で公開されているのでまずは Gemfile を書いて bundle install
します。
$ cat Gemfile source 'https://rubygems.org' gem 'acmesmith' $ bundle install --path vendor/bundle
bundle exec acmesmith help
を実行してみる
$ bundle exec acmesmith help Commands: acmesmith authorize DOMAIN # Get authz for DOMAIN. acmesmith current COMMON_NAME # show current version for certificate acmesmith help [COMMAND] # Describe available commands or on... acmesmith list [COMMON_NAME] # list certificates or its versions acmesmith register CONTACT # Create account key (contact e.g. ... acmesmith request COMMON_NAME [SAN] # request certificate for CN +COMMO... acmesmith show-certificate COMMON_NAME # show certificate acmesmith show-private-key COMMON_NAME # show private key Options: -c, [--config=CONFIG] # Default: ./acmesmith.yml -E, [--passphrase-from-env], [--no-passphrase-from-env] # Read $ACMESMITH_ACCOUNT_KEY_PASSPHRASE and $ACMESMITH_CERT_KEY_PASSPHRASE for passphrases
(revoke がまだ実装されていないのかな)
コンフィグファイルが必要なので acmesmith.yml
を作成します。
endpoint: https://acme-v01.api.letsencrypt.org/ storage: type: filesystem path: /home/ytera/acmesmish/certs challenge_responders: - route53: {} account_key_passphrase: certificate_key_passphrase:
aws_access_key
の中に access_key_id
, secret_access_key
を書くこともできますが aws-sdk を使っているので ~/.aws/credentials
があればそれを使ってくれます。
Route53 の操作のために IAM に必要な policy を設定しておく必要があります。これも README に全部書かれています。https://github.com/sorah/acmesmith#all-access-s3–route53-setup
acmesmith.yml
で storage
の path
に指定したディレクトリは予め作成しておく必要があります。
まずは register
サブコマンドでアカウントを作成します。
path
配下に account.pem
が作成されます。アカウントは公開鍵認証のようです。
account_key_passphrase
が空であれば暗号化されずに保存されます。
次にドメインの認証です、ドメインは証明書のコモンネームに指定するものです。
$ bundle exec acmesmith authorize www.teraoka.me => Responding challenge dns-01 for www.teraoka.me in Acmesmith::ChallengeResponders::Route53 * UPSERT: TXT "_acme-challenge.www.teraoka.me", "\"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\"" on /hostedzone/XXXXXXXXXXXXXX * requested change: /change/************** => Waiting for change * change "/change/**************" is still "PENDING" ... * change "/change/**************" is still "PENDING" ... * change "/change/**************" is still "PENDING" ... * change "/change/**************" is still "PENDING" ... * change "/change/**************" is still "PENDING" ... * change "/change/**************" is still "PENDING" ... * synced! => Requesting verification... * verify_status: valid => Cleaning up challenge dns-01 for www.teraoka.me in Acmesmith::ChallengeResponders::Route53 * DELETE: TXT "_acme-challenge.www.teraoka.me", "\"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\"" on /hostedzone/XXXXXXXXXXXXXX * requested: /change/************** => Done
ドメインの前に _acme-challenge.
をつけた TXT
レコードを作成し、validation のリクエストを出して、成功したら不要となった TXT
を早速削除しています。ゴミが残らなくて良いですね。
このあと
$ bundle exec acmesmith request www.teraoka.me
と実行すれば完了です。証明書が certs/certs/www.teraoka.me/
の配下に保存されています。
Let’s Encrypt ではワイルドカード証明書の発行はできませんが SAN で複数ドメインの証明書は発行可能です。
$ bundle exec acmesmith request www.teraoka.me www.1q77.com
と実行したら
X509v3 Subject Alternative Name: DNS:www.1q77.com, DNS:www.teraoka.me
という証明書が発行されました。
あー、楽ちん。
sorah さんありがとう
今度 AWS KMS (Key Management Service) を使ってセキュアに保存する方法を KMS の勉強がてら試してみよう。 つづき
ところで acmesmith ってなんて読むんだ?