Acmesmith で証明書発行を試す – その1

無料で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.ymlstoragepath に指定したディレクトリは予め作成しておく必要があります。

まずは 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 ってなんて読むんだ?