rootca-cfssl
Thursday 3 April 2025 41 versions

cfssl von Cloudflare macht’s einfacher

Cfssl ist ein Tool von Cloudflare aus dem Jahr 2014, welches ohne die Verwendung von openssl auskommt.

  • Syntax und Kommando-Optionen sind einfacher zu verstehen.
  • Tool und Quellcode können von Github heruntergeladen werden.
  • Ergänzende Blog-Artikel aus 2015 und 2016 erläutern weitere Details des Toolsets.

Da die offizielle Dokumentation von cfssl etwas dürftig ist, sind diese privaten Blog-Artikel sehr hilfreich!

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.

Private-Key und CSR Dateien für einen Webservice erstellen

  1. Spezifikation für den CSR als JSON-Datei erstellen. Dabei gleich alle SANs (“Subject Alternate Names”) in den Abschnitt “hosts” einfügen. Das können sowohl DNS-Namen (FQDN) als auch IP-Adressen sein.
 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. Public und Private KEY für den CSR erstellen und von JSON- in’s PEM-Format wandeln.
 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
  1. CSR Datei von (irgend)einer CA unterschreiben lassen. Damit erhält man die signierte CRT Datei.
  • z.B. von openssl oder step-ca oder OPNsense
  • oder auch von cfssl: siehe nächster Abschnitt
  1. Fertiges Zertifikat (CRT-Datei) anzeigen.
1$ cp my-service.pem my-service.crt
2$ cfssl certinfo -cert my-service.crt

Signieren eines CSR von einer CA = Ausstellen eines Zertifikats (CRT) für einen Webservice

  1. Lokales Signieren
1$ cfssl gencert -ca my-ca.pem -ca-key my-ca-key.pem my-service-csr.json |
2    cfssljson -bare my-service
  1. Remote Signieren
1$ cfssl gencert -remote=remote_server my-service.csr.json |
2    cfssljson -bare my-service
  1. Fertiges Zertifikat (CRT-Datei) anzeigen.
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
  1. Beim 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

Eigene Root-CA erstellen

Dieses Beispiel wurde von Rob Blackbourn übernommen.

  1. Spezifikation für die CA als JSON-Datei erstellen.
 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. Public und Private KEY für die CA erstellen. Die Root-CA ist daran erkennbar, dass sie selbst signiert ist.
    (Also Issuer = Owner bzw. Subject).
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. PEM- in CRT-Datei kopieren und Zertifikat anzeigen.
1$ cp root-ca.pem root-ca.crt
2$ cfssl certinfo -cert root-ca.crt

Eigene (intermediate) Branch-CA erstellen

Dieses Beispiel wurde ebenfalls von Rob Blackbourn übernommen.

  1. Spezifikation für den CSR der Branch-CA als JSON-Datei erstellen.
 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. Public und Private KEY für den CSR der Branch-CA erstellen. Dabei entsteht auch eine nicht benötigte PEM-Datei.
1$ cfssl gencert -initca branch-ca-csr.json |
2    cfssljson -bare branch-ca
  1. Und den CSR gleich von der Root-CA signieren lassen. Dabei wird die ‘unnötige’ durch die ‘richtigePEM-Datei ersetzt.
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. PEM- in CRT-Datei kopieren und Zertifikat anzeigen.
1$ cp branch-ca.pem branch-ca.crt
2$ cfssl certinfo -cert branch-ca.crt

Eigene Leaf-CA erstellen

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. Spezifikation für den CSR der Leaf-CA als JSON-Datei erstellen.
 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. Public und Private KEY für den CSR der Leaf-CA erstellen. Dabei entsteht auch eine nicht benötigte PEM-Datei.
1$ cfssl gencert -initca leaf-ca-csr.json |
2    cfssljson -bare leaf-ca
  1. Und den CSR gleich von der Branch-CA signieren lassen. Dabei wird die ‘unnötige’ durch die ‘richtigePEM-Datei ersetzt.
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. PEM- in CRT-Datei kopieren und Zertifikat anzeigen.
1$ cp leaf-ca.pem leaf-ca.crt
2$ cfssl certinfo -cert leaf-ca.crt

Verwendung von KEY und CRT Dateien

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