最近更新できてなかったので小ネタ。

背景

最近はドメインさえ所有していればLet’s EncriptやAWS Cert Managerなどで手軽にに証明書を発行することができる。
ただ、一時的な検証用に環境を立ち上げたい場面では、自己署名証明書を利用する方が手軽だったりする。

通常であればそういった場合はOpenSSLコマンドを叩いて証明書を作成していたのだが、最近Terraformでも作成できるということに気づいた。

  • 検証環境の構築時にはTerraformを用いる場面もあるので構築に使うツールがTerraformで完結する
  • 用が済んだら terraform destroy でゴミをまとめて掃除できる

など、いくつかメリットがあるので今後この手法を使っていこうかなと思い、メモとして残しておく。

そのうち必要なvariablesを見繕ってmodule化しても良いかもしれない。

注意点

当然ながら証明書や秘密鍵がtfstateに含まれることになるので、ファイルの取扱には注意。
そもそも、この手法を検証以外の目的で使うことは推奨しません。

Terraform スニペット

## CA
resource "tls_private_key" "ca" {
  algorithm = "RSA"
}

resource "tls_self_signed_cert" "ca" {
  private_key_pem = tls_private_key.ca.private_key_pem

  subject {
    common_name  = "test.vpn.ca"
    organization = "abc"
  }

  validity_period_hours = 87600
  is_ca_certificate     = true

  allowed_uses = [
    "cert_signing",
    "crl_signing",
  ]
}

## Certification 
resource "tls_private_key" "server" {
  algorithm = "RSA"
}

resource "tls_cert_request" "server" {
  private_key_pem = tls_private_key.server.private_key_pem

  subject {
    common_name  = "test.vpn.client"
    organization = "abc"
  }
}

resource "tls_locally_signed_cert" "server" {
  cert_request_pem   = tls_cert_request.server.cert_request_pem
  ca_private_key_pem = tls_private_key.ca.private_key_pem
  ca_cert_pem        = tls_self_signed_cert.ca.cert_pem

  validity_period_hours = 87600

  allowed_uses = [
    "key_encipherment",
    "digital_signature",
    "server_auth",
  ]
}

## もしACMにimportして管理したい場合のおまけ
resource "aws_acm_certificate" "cert" {
  private_key       = tls_private_key.server.private_key_pem
  certificate_body  = tls_locally_signed_cert.server.cert_pem
  certificate_chain = tls_self_signed_cert.ca.cert_pem
}