HTTP検証
HTTP検証を使用したACME証明書の発行
cert-managerは、ACMEプロトコルを使用して、CAから証明書を取得するために使用できます。ACMEプロトコルは、ドメインの所有権を証明するために使用される様々なチャレンジメカニズムをサポートしており、それによってそのドメインに対して有効な証明書を発行できます。
そのようなチャレンジメカニズムの1つに、HTTP01チャレンジがあります。HTTP01チャレンジでは、特定のファイルがドメインに存在することを確認することで、ドメインの所有権を証明します。指定されたパスに指定されたファイルを公開できる場合、そのドメインを制御しているとみなされます。
以下の発行者 (Issuer) は、HTTP検証を有効にするために必要な情報を定義しています。発行者 (Issuer) リソースの詳細については、発行者 (Issuer) ドキュメントを参照してください。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: letsencrypt-stagingnamespace: defaultspec:acme:# The ACME server URLserver: https://acme-staging-v02.api.letsencrypt.org/directory# Email address used for ACME registrationemail: user@example.com# Name of a secret used to store the ACME account private keyprivateKeySecretRef:name: letsencrypt-staging# Enable the HTTP-01 challenge providersolvers:# An empty 'selector' means that this solver matches all domains- selector: {}http01:ingress:ingressClassName: nginx
Let's Encryptのステージング環境のACMEサーバーURLを指定しました。ステージング環境は信頼できる証明書を発行しませんが、本番環境に移行する前に検証プロセスが正常に機能していることを確認するために使用されます。Let's Encryptの本番環境ははるかに厳しいレート制限を課しているため、これらの制限に達する可能性を減らすために、ステージング環境から始めることを強くお勧めします。本番環境に移行するには、URLをhttps://acme-v02.api.letsencrypt.org/directory
に設定した新しい発行者 (Issuer) を作成するだけです。
ACMEプロトコルの最初の段階は、クライアントがACMEサーバーに登録することです。この段階には、非対称キーペアの生成が含まれ、次に発行者 (Issuer) で指定されたメールアドレスに関連付けられます。このメールアドレスを所有する有効なアドレスに変更してください。これは一般的に、証明書の更新時期が近づいたときに期限切れの通知を送信するために使用されます。生成された秘密鍵は、letsencrypt-staging
という名前のシークレットに保存されます。
ACMEチャレンジを処理するためのソルバーを1つ以上提供する必要があります。この場合、HTTP検証を使用したいので、http01
ソルバーを指定します。オプションで、異なるドメインに異なるソルバー構成をマップすることもできます。
上記の発行者 (Issuer) を作成したら、それを利用して証明書を取得できます。
apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: example-comnamespace: defaultspec:secretName: example-com-tlsissuerRef:name: letsencrypt-stagingcommonName: example.comdnsNames:- www.example.com
証明書リソースは、目的の証明書と、それを取得するために使用できる可能性のある方法を記述しています。ドキュメントで証明書リソースの詳細を確認できます。証明書が正常に取得された場合、結果のキーペアは、証明書と同じ名前空間にあるexample-com-tls
という名前のシークレットに保存されます。
証明書は、example.com
という共通名を持ち、サブジェクト代替名 (SAN)はexample.com
とwww.example.com
になります。TLSクライアントによってこれらのSANのみが尊重されることに注意してください。
証明書では、上記のletsencrypt-staging
発行者を参照しています。発行者は、証明書と同じ名前空間にある必要があります。クラスタスコープバージョンの発行者であるClusterIssuer
を参照する場合は、issuerRef
スタンザにkind: ClusterIssuer
を追加する必要があります。
ClusterIssuer
の詳細については、ClusterIssuer
ドキュメントを参照してください。
acme
スタンザは、ACMEチャレンジの構成を定義します。ここでは、ドメインの所有権を検証するために使用されるHTTP01チャレンジの構成を定義しました。http01
スタンザに記載されている各ドメインの所有権を検証するために、cert-managerは、HTTP01チャレンジを満たすHTTPエンドポイントを公開するPod、サービス、およびIngressを作成します。
http01
スタンザのingressClassName
、class
、およびname
フィールドを使用して、cert-managerがIngressリソースとどのように対話するかを制御できます。
-
ingressClassName
フィールドが指定されている場合、チャレンジを解決するために、ランダムに生成された名前を持つ新しいIngressリソースが作成されます。この新しいリソースには、ingressClassName
フィールドの値を持つingressClassName
フィールドが含まれます。これは、どのIngressコントローラーを使用するかを構成する推奨方法です。これは、NGINX Ingressコントローラーなどにも有効です。 -
class
フィールドが指定されている場合、チャレンジを解決するために、ランダムに生成された名前を持つ新しいIngressリソースが作成されます。この新しいリソースには、キーkubernetes.io/ingress.class
と、class
フィールドの値に設定された値を持つアノテーションが含まれます。このフィールドは、ingressClassName
フィールドをサポートしていないingress-gceでのみ推奨されます。 -
name
フィールドが指定されている場合、証明書と同じ名前空間にある同じ名前のIngressリソースが既に存在する必要があり、チャレンジを解決するために適切なルールを追加するためだけに変更されます。このフィールドは、各Ingressリソースに1つのパブリックIPアドレスを割り当てるGoogle Cloud Load Balancer Ingressコントローラーや、その他多数のコントローラーに役立ちます。手動で介入しないと、新しいIngressリソースを作成すると、すべてのチャレンジが失敗します。 -
どちらも指定されていない場合、ランダムに生成された名前を持つ新しいIngressリソースが作成されますが、Ingressクラスのアノテーションは設定されません。
-
両方が指定されている場合、
ingress
フィールドが優先されます。
ドメインの所有権が検証されると、cert-managerの影響を受けるすべてのリソースはクリーンアップまたは削除されます。
注:各ドメイン名をIngressコントローラーの正しいIPアドレスにポイントすることは、あなたの責任です。
上記の証明書を作成した後、kubectl describe
を使用して、証明書が正常に取得されたかどうかを確認できます。
$ kubectl describe certificate example-comEvents: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 "http-01" validationNormal DomainVerified 55m cert-manager Domain "www.example.com" verified with "http-01" validationNormal IssueCert 55m cert-manager Issuing certificate...Normal CertObtained 55m cert-manager Obtained certificate from ACME serverNormal CertIssued 55m cert-manager Certificate issued successfully
kubectl get secret example-com-tls -o yaml
を使用して、発行が成功したかどうかを確認することもできます。base64でエンコードされた署名付きTLSキーペアが表示されます。
証明書を取得すると、cert-managerは定期的にその有効性をチェックし、期限切れが近づくと更新を試みます。cert-managerは、証明書の「Not After」フィールドが現在時刻プラス30日より小さい場合、証明書が期限切れに近づいていると見なします。