新着:プロジェクトの最新情報についてはTwitterMastodonでご確認ください。

DNS検証

DNS検証を使用したACME証明書の発行

cert-managerは、ACMEプロトコルを使用して、CAから証明書を取得するために使用できます。ACMEプロトコルは、有効な証明書をそのドメインに対して発行できるように、ドメインの所有権を証明するために使用される様々なチャレンジメカニズムをサポートしています。

そのようなチャレンジメカニズムの1つがDNS01です。DNS01チャレンジでは、ドメインのDNSレコードを制御していることを証明することで、ドメインの所有権を証明します。これは、ドメインのDNSレコードを制御していることを証明する特定のコンテンツを含むTXTレコードを作成することによって行われます。

次の発行者(Issuer)は、DNS検証を有効にするために必要な情報を定義しています。発行者リソースの詳細については、発行者に関するドキュメントを参照してください。

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-staging
namespace: default
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: user@example.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# ACME DNS-01 provider configurations
solvers:
# An empty 'selector' means that this solver matches all domains
- selector: {}
dns01:
cloudDNS:
# The ID of the GCP project
# reference: https://cert-manager.dokyumento.jp/docs/tutorials/acme/dns-validation/
project: $PROJECT_ID
# This is the secret used to access the service account
serviceAccountSecretRef:
name: clouddns-dns01-solver-svc-acct
key: key.json
# We only use cloudflare to solve challenges for example.org.
# Alternative options such as 'matchLabels' and 'dnsZones' can be specified
# as part of a solver's selector too.
- selector:
dnsNames:
- example.org
dns01:
cloudflare:
email: my-cloudflare-acc@example.com
# !! Remember to create a k8s secret before
# kubectl create secret generic cloudflare-api-key-secret
apiKeySecretRef:
name: cloudflare-api-key-secret
key: api-key

Let's Encryptのステージング環境のACMEサーバーURLを指定しました。ステージング環境は信頼できる証明書を発行しませんが、本番環境に移行する前に検証プロセスが正しく機能していることを確認するために使用されます。Let's Encryptの本番環境ははるかに厳しいレート制限を課しているので、これらの制限に引っかかる可能性を減らすために、ステージング環境から始めることを強くお勧めします。本番環境に移行するには、URLをhttps://acme-v02.api.letsencrypt.org/directoryに設定した新しい発行者を作成するだけです。

ACMEプロトコルの最初の段階は、クライアントがACMEサーバーに登録することです。この段階には、非対称キーペアの生成が含まれ、次にそれは発行者で指定されたメールアドレスに関連付けられます。このメールアドレスを所有している有効なアドレスに変更してください。これは一般的に、証明書の更新期限が近づいたときに期限切れ通知を送信するために使用されます。生成された秘密鍵は、letsencrypt-stagingという名前のシークレットに保存されます。

dns01 スタンザには、DNSチャレンジを解決するために使用できるDNS01プロバイダーのリストが含まれています。私たちの発行者(Issuer)は2つのプロバイダーを定義しています。これにより、証明書を取得する際にどちらを使用するかを選択できます。

サポートされているプロバイダーのリストを含む、DNSプロバイダー構成の詳細については、DNS01リファレンスドキュメントを参照してください。

上記の発行者(Issuer)を作成したら、それを利用して証明書を取得できます。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls
issuerRef:
name: letsencrypt-staging
dnsNames:
- '*.example.com'
- example.com
- example.org

証明書リソースは、目的の証明書と、それを取得するために使用できる可能性のある方法を記述しています。ワイルドカードドメインの証明書も他のドメインと同様に取得できます。フォーマットの問題を避けるために、YAMLリソースでワイルドカードドメインをアスタリスクで囲んでください。example.com*.example.com の両方を同じ証明書に指定すると、各ドメインを順番に検証する必要があるため、検証の実行に少し時間がかかります。ドキュメントで証明書リソースの詳細を確認できます。証明書が正常に取得されると、結果のキーペアは、証明書と同じ名前空間内のexample-com-tlsという名前のシークレットに保存されます。

証明書は*.example.comという共通名を持ち、サブジェクト代替名(SAN)*.example.comexample.com、およびexample.orgになります。

証明書では、上記のletsencrypt-staging発行者を参照しています。発行者は、証明書と同じ名前空間にある必要があります。ClusterIssuer(発行者のクラスタスコープバージョン)を参照する場合は、issuerRef スタンザにkind: ClusterIssuer を追加する必要があります。

ClusterIssuerの詳細については、発行者の概念を参照してください。

acme スタンザは、ACMEチャレンジの構成を定義しています。ここでは、ドメインの所有権を検証するために使用されるDNSチャレンジの構成を定義しています。dns01 スタンザに記載されている各ドメインについて、cert-managerは、参照されている発行者からのプロバイダーの資格情報を使用して、_acme-challenge というTXTレコードを作成します。このレコードは、証明書を発行するためにACMEサーバーによって検証されます。ドメインの所有権が検証されると、cert-managerによって影響を受けたレコードはすべてクリーンアップされます。

注:選択したプロバイダーがドメインに対して権限を持っていることを確認することは、お客様の責任です。

上記の証明書を作成した後、kubectl describe を使用して、それが正常に取得されたかどうかを確認できます。

$ kubectl describe certificate example-com
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreateOrder 57m cert-manager Created new ACME order, attempting validation...
Normal DomainVerified 55m cert-manager Domain "*.example.com" verified with "dns-01" validation
Normal DomainVerified 55m cert-manager Domain "example.com" verified with "dns-01" validation
Normal DomainVerified 55m cert-manager Domain "example.org" verified with "dns-01" validation
Normal IssueCert 55m cert-manager Issuing certificate...
Normal CertObtained 55m cert-manager Obtained certificate from ACME server
Normal CertIssued 55m cert-manager Certificate issued successfully

kubectl get secret example-com-tls -o yaml を使用して、発行が成功したかどうかを確認することもできます。base64でエンコードされた署名付きTLSキーペアが表示されます。

証明書を取得したら、cert-managerは定期的にその有効性をチェックし、期限が近づくと更新を試みます。cert-managerは、証明書の「Not After」フィールドが現在時刻プラス30日より小さい場合、証明書が期限切れ間近であると見なします。