TerraformでLet'sEncryptの証明書を取得する


実はTerraformでもACMEがサポートされています。(知っている人は知っている)
というわけで、terraformでLet'sEncryptの証明書を取得してみます。
認証についてはRoute53(DNS)で行います。

前提

terraformではDNS01 challengeが推奨されています。
ですので、ここでもDNSでの認証を行います。
様々なDNSがサポートされていますが今回はawsのRoute53を利用します。

なお、

  • ワイルドカードはやりません
  • SANの利用も同様にしません
  • なので、対象はFQDN(サブドメイン付き)1つのみ

補足

ワイルドカードの証明書は便利ですが、万が一の場合利用する全サービスに影響が及ぶことを考えれば利用すべきではないと思っています。
特に、Let'sEncryptのようにマネージドで自動的に更新するのにワイルドカード証明書を使う必要はないと思います。

セキュリティのために証明書を利用するのに、セキュリティを損ねる運用を採用するのは本末転倒だと思っています。

解説

ま、大して設定するところもないのでソース見るだけでもわかると思いますが………

acme

ACMEのエンドポイントurlです。今回の例ではLet's Encryptです。1

provider "acme" {
  server_url = "https://acme-v02.api.letsencrypt.org/directory"
  # server_url = "https://acme-staging-v02.api.letsencrypt.org/directory"
}

tls_private_key

アカウント用の秘密鍵を生成します。
アルゴリズムはRSAにしてます。2

resource "tls_private_key" "private_key" {
  algorithm = "RSA"
}

acme_registration

ACMEのアカウント登録

resource "acme_registration" "reg" {
  account_key_pem = "${tls_private_key.private_key.private_key_pem}"
  email_address   = "[email protected]"
}

acme_certificate

お待ちかねの取得。
AccessKeyとSecretIDでもOKですが、今回のソースではProfile指定をしています。

resource "acme_certificate" "certificate" {
  account_key_pem           = "${acme_registration.reg.account_key_pem}"
  common_name               = "sub.example.com"
  # min_days_remaining            = "7"

  dns_challenge {
    provider = "route53"
    config {
      AWS_PROFILE = "PROFILE_NAME"
      # AWS_ACCESS_KEY_ID     = "${var.aws_access_key}"
      # AWS_SECRET_ACCESS_KEY = "${var.aws_secret_key}"
      AWS_DEFAULT_REGION    = "ap-northeast-1"
    }
  }
}
注意点
  • profileにはRole Arnは使えません。3
  • regionを指定しないとエラーになります。3
  • 権限は適切に

取得できる値

今回のソースで取得できる値のうち特に必要そうなもの。

変数 内容
acme_certificate.certificate.certificate_pem 証明書(pem形式)
acme_certificate.certificate.issuer_pem 中間証明書(pem形式)
acme_certificate.certificate.private_key_pem 秘密鍵(pem形式)

更新

証明書の更新が必要な場合はterraform applyを行った際に必要に応じて自動的に行われます。
必要性はmin_days_remainingの値で判断されます。4
証明書の期限がこの値を下回った場合に更新されます。(0を設定すると更新はされません)

2018.11.06

修正:server_urlがステージングになっておりました。


  1. つか、他のとこあるんだべか 

  2. ECDSAも作成できます 

  3. でした。使用できたという人がいたら教えてください 

  4. Defaultは7