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
cfssl
etwas 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 OPNsense
cfssl
: 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