Terraformで自己署名証明書を管理する
最近更新できてなかったので小ネタ。
背景
最近はドメインさえ所有していれば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
}
Read other posts