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.usages
にserver auth
とclient 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