SUPER-G.EEK.JP

twitter: @hum_op_dev
github: ophum

cert-managerでプライベート認証局を作ってみる

目次

cert-manager の selfsigned issuer を利用してプライベート認証局を作ってみます。

公式ドキュメントをやるだけ https://cert-manager.io/docs/configuration/selfsigned/

プライベート認証局を作成する

namespace を作成

$ kubectl create namespace sandbox

自己署名用の Issuer を作成する

selfSigned な Issuer は与えられた鍵を利用して署名します。(つまり自己署名)

自己署名するので ClusterIssuer としても良かったかも・・・

1$ kubectl apply -f - <<EOF
2apiVersion: cert-manager.io/v1
3kind: Issuer
4metadata:
5  name: selfsigned-issuer
6  namespace: sandbox
7spec:
8  selfSigned: {}
9EOF

selfsigned-issuer で自己署名した CA 証明書を作成する

 1$ kubectl apply -f - <<EOF
 2apiVersion: cert-manager.io/v1
 3kind: Certificate
 4metadata:
 5  name: my-selfsigned-ca
 6  namespace: sandbox
 7spec:
 8  isCA: true
 9  commonName: my-selfsigned-ca
10  secretName: root-secret
11  privateKey:
12    algorithm: ECDSA
13    size: 256
14  issuerRef:
15    name: selfsigned-issuer
16    kind: Issuer
17    group: cert-manager.io
18EOF

自己署名した CA 証明書を利用した CA の Issuer を作成する

 1$ kubectl apply -f - <<EOF
 2apiVersion: cert-manager.io/v1
 3kind: Issuer
 4metadata:
 5  name: my-ca-issuer
 6  namespace: sandbox
 7spec:
 8  ca:
 9    secretName: root-secret
10EOF

これで、sandbox ネームスペース内では my-ca-issuer を使って証明書を発行することができます。

自己署名認証局で証明書を発行する

spec.usagesserver authclient authを指定してサーバー証明書としてもクライアント証明書としても使える証明書を発行してみます。

spec.issuerRefにプライベート認証局の Issuer を指定することでプライベート認証局で証明書を発行できます。

 1$ kubectl apply -f - <<EOF
 2apiVersion: cert-manager.io/v1
 3kind: Certificate
 4metadata:
 5  name: example-com
 6  namespace: sandbox
 7spec:
 8  secretName: example-com-tls
 9  privateKey:
10    algorithm: RSA
11    encoding: PKCS1
12    size: 2048
13  duration: 2160h
14  renewBefore: 360h
15  isCA: false
16  usages:
17    - server auth
18    - client auth
19  subject:
20    organizations:
21      - cert-manager
22  commonName: example.com
23  dnsNames:
24    - example.com
25    - www.example.com
26  ipAddresses:
27    - 127.0.0.1
28  issuerRef:
29    name: my-ca-issuer
30    kind: Issuer
31    group: cert-manager.io
32EOF

example-com が作成され READY=True になっていることがわかります。

1$ kubectl -n sandbox get certificate
2NAME               READY   SECRET            AGE
3example-com        True    example-com-tls   7m59s
4my-selfsigned-ca   True    root-secret       14m

example-com-tls シークレットには ca.crt, tls.crt, tls.key の 3 つのデータが入っています。

1$ kubectl -n sandbox get secret example-com-tls
2NAME              TYPE                DATA   AGE
3example-com-tls   kubernetes.io/tls   3      9m29s

example-com-tls の ca.crt を見てみる

Issuer の CN と Subject の CN が my-selfsigned-caとなっており自己署名なことがわかります。 また、Basic Constraints には CA:TRUE があり CA であることがわかります。

 1$ kubectl -n sandbox get secrets example-com-tls -o json | jq -r '.data.["ca.crt"]' | base64 -d | openssl x509 -noout -text
 2Certificate:
 3    Data:
 4        Version: 3 (0x2)
 5        Serial Number:
 6            7e:56:a6:4c:45:03:92:5e:fe:df:c0:f5:4d:28:a8:5c
 7        Signature Algorithm: ecdsa-with-SHA256
 8        Issuer: CN = my-selfsigned-ca
 9        Validity
10            Not Before: Apr 14 16:27:40 2025 GMT
11            Not After : Jul 13 16:27:40 2025 GMT
12        Subject: CN = my-selfsigned-ca
13        Subject Public Key Info:
14            Public Key Algorithm: id-ecPublicKey
15                Public-Key: (256 bit)
16                pub:
17                    04:3f:1a:e1:3e:3e:c4:5e:04:95:34:e1:a8:23:67:
18                    bd:92:2b:99:22:aa:ad:bd:84:41:1c:54:e7:fd:d6:
19                    83:d5:2e:57:de:cc:82:59:bc:9b:a2:45:1d:ae:20:
20                    c1:e9:58:38:f1:26:0f:82:9a:ba:f8:77:57:cc:61:
21                    eb:af:fd:a2:58
22                ASN1 OID: prime256v1
23                NIST CURVE: P-256
24        X509v3 extensions:
25            X509v3 Key Usage: critical
26                Digital Signature, Key Encipherment, Certificate Sign
27            X509v3 Basic Constraints: critical
28                CA:TRUE
29            X509v3 Subject Key Identifier:
30                D5:DF:81:32:68:51:D4:CD:C0:2F:F4:61:6E:93:37:CA:F9:12:B3:A1
31    Signature Algorithm: ecdsa-with-SHA256
32    Signature Value:
33        30:45:02:20:05:dc:a3:71:19:33:f8:98:d6:80:b7:01:a1:cf:
34        67:90:26:ae:f8:09:64:e7:2f:1e:68:d9:f7:86:5a:9d:15:1a:
35        02:21:00:f0:5d:29:f0:01:25:74:37:9b:65:92:76:11:0a:16:
36        4c:6d:4a:38:4b:d5:17:46:78:cd:64:9d:ee:13:48:cf:cb

example-com-tls の tls.crt を見てみる

Issuer の CN が my-selfsigned-ca となっており自己署名認証局によって発行されていることがわかります。 Subject も O = cert-manager, CN = example.comとなっています。 また、Extended Key UsageにはTLS Web Server Authentication, TLS Web Client Authenticationがあり、証明書の用途がサーバー証明書・クライアント証明書ということがわかります。

 1$ kubectl -n sandbox get secrets example-com-tls -o json | jq -r '.data.
 2["tls.crt"]' | base64 -d | openssl x509 -noout -text
 3Certificate:
 4    Data:
 5        Version: 3 (0x2)
 6        Serial Number:
 7            20:9d:46:87:da:75:26:e9:65:7d:d2:55:52:40:ed:83
 8        Signature Algorithm: ecdsa-with-SHA256
 9        Issuer: CN = my-selfsigned-ca
10        Validity
11            Not Before: Apr 14 16:34:03 2025 GMT
12            Not After : Jul 13 16:34:03 2025 GMT
13        Subject: O = cert-manager, CN = example.com
14        Subject Public Key Info:
15            Public Key Algorithm: rsaEncryption
16                Public-Key: (2048 bit)
17                Modulus:
18                    00:c7:2f:e9:d8:ee:4b:3a:df:46:46:5d:0f:39:2b:
19                    68:4f:13:9c:4e:f6:b0:7c:52:dd:dd:9d:f9:a3:b5:
20                    cb:51:96:57:79:7a:f2:37:48:49:60:ec:3d:b6:57:
21                    c3:aa:af:76:5f:75:9b:61:01:46:df:51:c1:57:ec:
22                    b1:c1:d2:76:a1:26:2d:17:5c:96:c5:4c:bd:50:0a:
23                    1b:15:e2:3c:e2:48:ad:02:4a:36:7b:ff:b7:e9:d1:
24                    eb:38:be:69:2d:e7:5e:79:9e:73:33:65:74:49:86:
25                    97:4f:2a:f6:99:fe:43:03:04:f5:2e:4f:58:75:48:
26                    b5:50:a1:eb:0e:3f:bb:9d:f2:92:4d:87:18:c2:6f:
27                    d3:e9:95:95:c0:86:13:e2:69:c6:68:39:57:93:5c:
28                    9c:fe:89:6d:84:8a:d1:5d:8e:26:dc:9b:f0:61:a5:
29                    76:15:b9:5b:3b:f5:91:d9:1f:bc:88:6a:5a:b9:fe:
30                    43:da:f8:17:eb:ec:4c:20:43:57:97:70:03:a9:34:
31                    3f:56:af:ce:32:d7:e6:7f:c9:30:06:1d:79:ed:9a:
32                    e9:92:c0:08:02:4d:e1:b2:d0:66:18:65:67:8c:1a:
33                    76:0f:64:54:30:07:cb:29:e4:44:f9:1b:1f:8d:a7:
34                    8f:b5:13:19:5b:96:69:03:b8:49:a5:37:9f:47:c5:
35                    b9:09
36                Exponent: 65537 (0x10001)
37        X509v3 extensions:
38            X509v3 Extended Key Usage:
39                TLS Web Server Authentication, TLS Web Client Authentication
40            X509v3 Basic Constraints: critical
41                CA:FALSE
42            X509v3 Authority Key Identifier:
43                D5:DF:81:32:68:51:D4:CD:C0:2F:F4:61:6E:93:37:CA:F9:12:B3:A1
44            X509v3 Subject Alternative Name:
45                DNS:example.com, DNS:www.example.com, IP Address:127.0.0.1
46    Signature Algorithm: ecdsa-with-SHA256
47    Signature Value:
48        30:46:02:21:00:f0:0b:48:c4:ff:67:f1:3a:06:ff:6a:db:b1:
49        56:4d:86:de:17:2e:17:04:44:4b:b0:97:89:06:61:45:a0:94:
50        80:02:21:00:a8:e0:5c:b0:0b:79:a3:10:3c:94:fb:32:fe:92:
51        09:a2:43:2f:f6:3e:f8:80:f3:ec:9e:36:cd:b6:06:4a:3b:56