Aus diesen Gründen ist cfssl das (bis jetzt) von mir bevorzugte Tool zum Arbeiten mit X.509-Zertifikaten. Diese Position könnte ihm aber von der Neuentdeckung Smallstep streitig gemacht werden.
cfssl von Cloudflare macht’s einfacher ¶Cfssl ist ein Tool von Cloudflare aus dem Jahr 2014, welches ohne die Verwendung von openssl auskommt.
Da die offizielle Dokumentation von
cfssletwas dürftig ist, sind diese privaten Blog-Artikel sehr hilfreich!
1{
2 "CN": "my-service.fqdn.tld",
3 "key": {
4 "algo": "ecdsa",
5 "size": 256
6 },
7 "names": [
8 {
9 "C": "DE",
10 "ST": "RLP",
11 "L": "Ludwigshafen",
12 "O": "AG MicroComputer",
13 "OU": "Pagong"
14 }
15 ],
16 "hosts": [
17 "my-service.fqdn.tld",
18 "10.12.13.14"
19 ]
20}
1$ cfssl genkey my-service-csr.json | cfssljson -bare my-service
22025/03/21 15:14:28 [INFO] generate received request
32025/03/21 15:14:28 [INFO] received CSR
42025/03/21 15:14:28 [INFO] generating key: rsa-2048
52025/03/21 15:14:28 [INFO] encoded CSR
6
7$ ls -l
8-rw-r--r-- 1 pagong users 1155 Mar 21 15:14 my-service.csr
9-rw-r--r-- 1 pagong users 322 Mar 21 15:08 my-service-csr.json
10-rw------- 1 pagong users 1679 Mar 21 15:14 my-service-key.pem
11
12$ cfssl certinfo -csr my-service.csr
openssl oder step-ca oder OPNsensecfssl: siehe nächster Abschnitt1$ cp my-service.pem my-service.crt
2$ cfssl certinfo -cert my-service.crt
1$ cfssl gencert -ca my-ca.pem -ca-key my-ca-key.pem my-service-csr.json |
2 cfssljson -bare my-service
1$ cfssl gencert -remote=remote_server my-service.csr.json |
2 cfssljson -bare my-service
1$ ls my-service*
2my-service.csr
3my-service-csr.json
4my-service-key.pem
5my-service.pem
6
7$ cp my-service.pem my-service.crt
8$ cfssl certinfo -cert my-service.crt
cfssl sign Vorgang kann auch noch eine JSON-Konfigurationsdatei cfssl-cfg.json mit Profile-Definitionen genutzt werden, um das “Finetuning” des Verwendungszwecks (oder anderer Parameter) des Zertifkats anzupassen.1$ cfssl sign -config cfssl-cfg.json -profile profile_name \
2 -ca ca.pem -ca-key ca-key.pem my-service.csr |
3 cfssljson -bare my-service
Dieses Beispiel wurde von Rob Blackbourn übernommen.
1{
2 "CN": "Custom Widgets Root CA",
3 "key": {
4 "algo": "rsa",
5 "size": 4096
6 },
7 "names": [
8 {
9 "C": "GB",
10 "L": "London",
11 "O": "Custom Widgets",
12 "OU": "Custom Widgets Root CA",
13 "ST": "England"
14 }
15 ]
16}
1$ cfssl genkey -initca root-ca-csr.json |
2 cfssljson -bare root-ca
3
4$ ls root-ca*
5root-ca.csr
6root-ca-csr.json
7root-ca-key.pem
8root-ca.pem
1$ cp root-ca.pem root-ca.crt
2$ cfssl certinfo -cert root-ca.crt
Dieses Beispiel wurde ebenfalls von Rob Blackbourn übernommen.
1{
2 "CN": "Custom Widgets Branch CA",
3 "key": {
4 "algo": "rsa",
5 "size": 2048
6 },
7 "names": [
8 {
9 "C": "GB",
10 "L": "London",
11 "O": "Custom Widgets",
12 "OU": "Custom Widgets Branch CA",
13 "ST": "England"
14 }
15 ],
16 "ca": {
17 "expiry": "42720h"
18 }
19}
1$ cfssl gencert -initca branch-ca-csr.json |
2 cfssljson -bare branch-ca
1$ cfssl sign -config cfssl-cfg.json -profile branch_ca \
2 -ca root-ca.pem -ca-key root-ca-key.pem branch-ca.csr |
3 cfssljson -bare branch-ca
4
5$ ls branch-ca*
6branch-ca.csr
7branch-ca-csr.json
8branch-ca-key.pem
9branch-ca.pem
1$ cp branch-ca.pem branch-ca.crt
2$ cfssl certinfo -cert branch-ca.crt
Dies erfolgt ähnlich zum Vorgang der Signierung der Branch-CA durch die Root-CA. Nur wird in diesem Fall die Leaf-CA durch die Branch-CA signiert.
1{
2 "CN": "Custom Widgets Leaf CA",
3 "key": {
4 "algo": "ecdsa",
5 "size": 384
6 },
7 "names": [
8 {
9 "C": "GB",
10 "L": "London",
11 "O": "Custom Widgets",
12 "OU": "Custom Widgets Leaf CA",
13 "ST": "England"
14 }
15 ],
16 "ca": {
17 "expiry": "8760h"
18 }
19}
1$ cfssl gencert -initca leaf-ca-csr.json |
2 cfssljson -bare leaf-ca
1$ cfssl sign -config cfssl-cfg.json -profile leaf_ca \
2 -ca branch-ca.pem -ca-key branch-ca-key.pem leaf-ca.csr |
3 cfssljson -bare leaf-ca
4
5$ ls leaf-ca*
6leaf-ca.csr
7leaf-ca-csr.json
8leaf-ca-key.pem
9leaf-ca.pem
1$ cp leaf-ca.pem leaf-ca.crt
2$ cfssl certinfo -cert leaf-ca.crt
Umwandeln von KEY- und CRT-Dateien zu Kubernetes secrets zur Verwendung in einem mit TLS abgesicherten Web-Service.
1$ CRT="$SRCDIR/my-service.crt"
2$ KEY="$SRCDIR/my-service.key"
3$ kubectl -n my-namespace create secret tls my-service-tls --cert="$CRT" --key="$KEY"
4$ kubectl -n my-namespace describe secret my-service-tls