過去2回 Acmesmith を filesystem, S3 を storage として試してきました。
Acmesmith で証明書発行を試す – その1 (filesystem)
Acmesmith で証明書発行を試す – その2 (S3)
証明書の秘密鍵はセキュアな管理がが必要なので KMS (Key Management Service) を使って S3 に保存することを試してみます。
まずは AWS の IAM Console にある「Encryption Keys(暗号化キー)」にてキーを作成します(リージョンに注意しましょう)。
作成時の設定でキーの利用者に Acmesmith で使う IAM ユーザーを指定しておきます(後からでも設定可能です)。
後は key id (11111111-2222-3333-4444-555555555555 みたいなやつ)を acmesmith.yml に設定するだけです。
endpoint: https://acme-v01.api.letsencrypt.org/ storage: type: s3 bucket: BUCKET-NAME region: ap-northeast-1 use_kms: true kms_key_id: 11111111-2222-3333-4444-555555555555 challenge_responders: - route53: {} account_key_passphrase: certificate_key_passphrase:
kms_key_id
だけを設定しておくと account.pem
(Let’s Encrypt のアカウント用秘密鍵)も証明書用の秘密鍵もこの KMS キーで暗号化されます。kms_key_id_account
と kms_key_id_certificate_key
をそれぞれ別のキーに設定すると別々のキーで暗号化されます。証明書の秘密鍵はダウンロードさせるけど Let’s Encrypt へのアクセスは権限を分けたいと行った場合に使えそうです。勝手に Revoke されないようにとか。
acmesmith.yml
の準備ができたらこれまでと同様に register
, authorize
, request
すれば証明書がゲットできます。
S3 Console で詳細を確認すると「サーバー側の暗号化: AWS KMS マスターキーの使用: acmetest」と表示されていました。暗号化されているようです。サーバーサイド暗号となっているのでキーへのアクセス権あれば透過的に扱えます。コンソールからダウロードしたらデコードされています。
cert.pem
, chain.pem
, fullchain.pem
, key.pem
が作成されますが暗号の必要な key.pem
だけが暗号化されています。
使うだけじゃなくて revoke とか renew とかのコマンド追加の PR ができれば
(2016/06/10 追記)
私なんかがやらなくてもどんどん改善されてました
0.4.0 での help はこんな出力
0.3.0 で autorenew や add-san が追加され、0.4.0 では save-pkcs12 が追加されてます
$ bundle exec acmesmith help Commands: acmesmith add-san COMMON_NAME [ADDITIONAL_SANS] # request renewal of ... acmesmith authorize DOMAIN # Get authz for DOMAIN. acmesmith autorenew # request renewal of ... acmesmith current COMMON_NAME # show current versio... acmesmith help [COMMAND] # Describe available ... acmesmith list [COMMON_NAME] # list certificates o... acmesmith register CONTACT # Create account key ... acmesmith request COMMON_NAME [SAN] # request certificate... acmesmith save-certificate COMMON_NAME --output=PATH # Save certificate to... acmesmith save-pkcs12 COMMON_NAME --output=PATH # Save ceriticate and... acmesmith save-private-key COMMON_NAME --output=PATH # Save private key to... 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_CERTIFICATE_KEY_PASSPHRASE for passphrases