自己署名証明書の作成方法

Kubernetes クラスタ上に cert-manager を入れて、自己署名証明書を発行するための手順メモ。

動作確認 ver

  • cert-manager v0.8.0
  • cert-manager v0.11.0

ルート証明書として発行する場合

やること

  1. 自己署名証明書発行用の ClusterIssuer をデプロイする
    1. の ClusterIssuer を参照して証明書を発行する Certificate をデプロイする

ClusterIssuer デプロイ

$ kubectl apply -f - <<EOF apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata: name: selfsigning spec: selfSigned: {} EOF

Certificate デプロイ

  • 証明書を格納する namespace にデプロイする
  • issuerRef で↑でデプロイした ClusterIssuer を参照する形で指定する
  • organization は指定しないと cert-manager という文字列が入る
    • 証明書の中身に O = cert-manager という文字列が入ってしまう
  • commonName にコモンネーム、dnsNames に subjectAltNames を入れてあげる
  • 証明書を更新して再度吐かせたい場合は、commonName/dnsNames あたりを変更してあげないとなぜか cert-manager が再発行をしてくれない…(原因不明
$ kubectl apply -f - <<EOF apiVersion: cert-manager.io/v1alpha2 kind: Certificate metadata: name: selfsigned-wildcard-example-com namespace: app spec: commonName: '*.example.com' dnsNames: - hogehoge.example.com - example.com issuerRef: kind: ClusterIssuer name: selfsigning organization: - example.com self signed secretName: selfsigned-wildcard-example-com EOF

クラスタ内に CA を立てて、CA に発行させる場合

やること

  1. 自己署名証明書発行用の ClusterIssuer をデプロイする
    1. の ClusterIssuer を参照して CA の証明書を発行する Certificate をデプロイする
    1. で発行した CA を参照する Issuer をデプロイする
    1. の Issuer を参照しつつ発行する Certificate をデプロイする

ClusterIssuer デプロイ

Certificate デプロイ(CA 証明書)

  • isCA: true がミソ
  • secretName で指定された名前の Secret に CA 証明書・鍵のペアが出力される
$ kubectl apply -f - <<EOF apiVersion: cert-manager.io/v1alpha2 kind: Certificate metadata: name: example-com-root-ca namespace: app spec: commonName: example.com Root CA duration: 43800h0m0s # 5 years isCA: true issuerRef: kind: ClusterIssuer name: selfsigning organization: - example.com secretName: example-com-root-ca EOF

Issuer デプロイ(CA利用)

  • CA 証明書を使う Issuer を利用しつつ証明書を発行するような Certificate をデプロイする
$ kubectl apply -f - <<EOF apiVersion: cert-manager.io/v1alpha2 kind: Issuer metadata: name: example-com namespace: app spec: ca: secretName: example-com-root-ca EOF

Certificate デプロイ(CA に発行させる)

$ kubectl apply -f - <<EOF apiVersion: cert-manager.io/v1alpha2 kind: Certificate metadata: name: selfsigned-wildcard-apps-by-example-com-root-ca namespace: app spec: commonName: '*.example.com' duration: 8760h0m0s # 365 days issuerRef: kind: Issuer name: example-com organization: - example.com secretName: selfsigned-wildcard-apps-by-example-com-root-ca EOF