SelfSigned
⚠️ 自己署名
発行者は、一般的にローカルでのPKIブートストラップに役立ちますが、これは上級ユーザー向けの複雑なトピックです。本番環境で安全に使用するには、PKIを実行することで、ローテーション、トラストストアの配布、ディザスタリカバリに関する複雑な計画要件が発生します。
独自のPKIを実行する予定がない場合は、別の発行者タイプを使用してください。
自己署名
発行者は、それ自体が認証局を表すものではありません。代わりに、証明書が指定された秘密鍵を使用して「自己署名」されることを示します。言い換えれば、証明書の秘密鍵を使用して証明書自体に署名します。
この発行者
タイプは、カスタムPKI(公開鍵インフラストラクチャ)のルート証明書のブートストラップ、または簡単なテストのためのアドホック証明書の生成に役立ちます。
自己署名
発行者には、セキュリティ上の問題を含む重要な注意点があります。一般的には、自己署名
発行者ではなくCA
発行者を使用することをお勧めします。ただし、自己署名
発行者は、最初にCA
発行者をブートストラップする際に非常に役立ちます。
注:自己署名証明書を参照する
CertificateRequest
には、cert-manager.io/private-key-secret-name
アノテーションも含まれている必要があります。これは、CertificateRequest
に対応する秘密鍵が証明書の署名に必要であるためです。このアノテーションはCertificate
コントローラーによって自動的に追加されます。
デプロイメント
自己署名
発行者は他のリソースに依存しないため、構成が最も簡単です。発行者仕様にはSelfSigned
スタンザのみが存在する必要があり、他の構成は必要ありません。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: selfsigned-issuernamespace: sandboxspec:selfSigned: {}
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: selfsigned-cluster-issuerspec:selfSigned: {}
デプロイメント後、発行者が署名準備完了であることをすぐに確認できます。
$ kubectl get issuers -n sandbox -o wide selfsigned-issuerNAME READY STATUS AGEselfsigned-issuer True 2m$ kubectl get clusterissuers -o wide selfsigned-cluster-issuerNAME READY STATUS AGEselfsigned-cluster-issuer True 3m
CA
発行者のブートストラップ
自己署名
発行者の理想的なユースケースの1つは、cert-manager CA
発行者を含め、プライベートPKIのカスタムルート証明書をブートストラップすることです。
以下のYAMLは、自己署名
発行者を作成し、ルート証明書を発行し、そのルートをCA
発行者として使用します。
apiVersion: v1kind: Namespacemetadata:name: sandbox---apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: selfsigned-issuerspec:selfSigned: {}---apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: my-selfsigned-canamespace: sandboxspec:isCA: truecommonName: my-selfsigned-casecretName: root-secretprivateKey:algorithm: ECDSAsize: 256issuerRef:name: selfsigned-issuerkind: ClusterIssuergroup: cert-manager.io---apiVersion: cert-manager.io/v1kind: Issuermetadata:name: my-ca-issuernamespace: sandboxspec:ca:secretName: root-secret
あるいは、自己署名
Certificate
CAを使用してクラスタ内のどこでもCertificates
に署名するためにClusterIssuer
を使用する場合は、以下のYAMLを使用してください(最後のステップがわずかに変更されています)。
apiVersion: v1kind: Namespacemetadata:name: sandbox---apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: selfsigned-issuerspec:selfSigned: {}---apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: my-selfsigned-canamespace: cert-managerspec:isCA: truecommonName: my-selfsigned-casecretName: root-secretprivateKey:algorithm: ECDSAsize: 256issuerRef:name: selfsigned-issuerkind: ClusterIssuergroup: cert-manager.io---apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: my-ca-issuerspec:ca:secretName: root-secret
"selfsigned-issuer" ClusterIssuer
はルートCA証明書の発行に使用されます。次に、"my-ca-issuer" ClusterIssuer
は、証明書の発行と、新しく作成されたルートCA Certificate
を使用した署名に使用されます。これは、将来のクラスタ全体の証明書に使用します。
CRL配布ポイント
オプションで、CRL配布ポイントを文字列の配列として指定できます。各文字列は、発行された証明書の失効状況を確認できるCRLの場所を識別します。
...spec:selfSigned:crlDistributionPoints:- "http://example.com"
注意点
信頼
自己署名
証明書を使用するクライアントは、事前に証明書を所有していない限り、それらを信頼する方法がありません。クライアントがサーバーとは異なる名前空間にある場合、これは管理が困難になる可能性があります。
この制限は、trust-managerを使用してca.crt
を他の名前空間に配布することで対処できます。
トラストストアの配布の問題を解決するための安全な代替手段はありません。「TOFU」(Trust-on-First-Use)を使用して証明書を信頼することはできますが、その方法は中間者攻撃に対して脆弱です。
証明書の有効性
自己署名証明書の副作用の1つは、そのサブジェクトDNとその発行者DNが同一であることです。X.509 RFC 5280、セクション4.1.2.4では、以下が要求されます。
issuerフィールドには、空ではない識別名(DN)を含める必要があります。
しかし、自己署名証明書には、デフォルトでサブジェクトDNが設定されていません。証明書のサブジェクトDNを手動で設定しない限り、発行者DNは空になり、証明書は技術的には無効になります。
この仕様の特定の領域の検証は断片的であり、TLSライブラリによって異なりますが、将来的にライブラリがその検証を(完全に仕様の範囲内で)改善し、空の発行者DNを持つ証明書を使用している場合にアプリケーションが壊れるリスクが常に存在します。
これを回避するには、自己署名
証明書のサブジェクトを設定してください。これは、自己署名
発行者によって発行されるcert-manager Certificate
オブジェクトでspec.subject
を設定することで実行できます。
バージョン1.3以降、cert-managerは、空の発行者DNを持つ自己署名
発行者によって証明書が作成されていることを検出した場合、BadConfig
タイプのKubernetes 警告イベントを発行します。