Commit 23bec49e authored by arw's avatar arw
Browse files

zertifikatsmagie v1

parents
# Zertifikat bauen
```bash
export TARGET=<Rechnername>
mkdir $TARGET
cp config-template.cnf ${TARGET}/${TARGET}.cnf
cd $TARGET
vim ${TARGET}.cnf
# alle FIXME-Zeilen suchen und anpassen
openssl genrsa -out ${TARGET}.key 4096
openssl req -new -sha512 -key ${TARGET}.key -config ${TARGET}.cnf -out ${TARGET}.csr
openssl req -noout -text -in ${TARGET}.csr | less
# nachschauen ob da alle alternativeNames richtig drinstehen, ob hash sha512 ist und ob 4096 bit schluessellaenge sind
pwgen -s 15 | tee ${TARGET}.pin
# .key geheimhalten und auf dem Webserver installieren
# .csr auf der Rechenzentrums-CA-Webseite hochladen, PIN angeben (wird fuer Widerruf gebraucht)
```
[RRZE-CA-Klickibunti](https://pki.pca.dfn.de/uni-erlangen-nuernberg-ca/pub/)
# Key-Pinning
*ab hier nur fuer Leute, die das auch wirklich brauchen*
## TLSA / DANE
Funktioniert:
- https
- smtp
- nur mit DNSSEC
- braucht fertiges Zertifikat
### empfohlene Vorgehensweise:
```bash
openssl rsa -in faui42.key -outform der -pubout | openssl sha256
(stdin)= 3d17d0dd8541772799bc3a5faf32e812e0baafccf7c35d0447977217db21420f
```
resultierender Record:
```
_443._tcp.www.example.com. IN TLSA 1 1 1 a1895145a50e0941f88db075ea25af57204907537602df1f80f2584346c794ca
```
Erklaerung der Optionen siehe unten
### funktioniert auch
```bash
openssl x509 -in ${TARGET}.crt -outform DER | openssl sha256
(stdin)= a1895145a50e0941f88db075ea25af57204907537602df1f80f2584346c794ca
# statt ${TARGET}.crt geht auch cert-$serial.pem wie vom DFN verteilt, ist dasselbe
```
resultierender Record:
```
_443._tcp.www.example.com. IN TLSA 1 0 1 a1895145a50e0941f88db075ea25af57204907537602df1f80f2584346c794ca
```
### Erklaerungen dazu
- 443 fuer https, mit _25 geht SMTP, etc., _tcp dito
- Die Optionen haben Bedeutung:
- 3 als erste Ziffer bedeutet "Domain issued", die Zertifikatskette wird nicht unbedingt zusaetzlich geprueft. Das Zertifikat ist direkt das Serverzertifikat
- erste Ziffer 2 heisst, dass die Zertifikatskette ebenfalls nicht geprueft wird, das Zertifikat ist ein CA-Zertifikat mit dem das Serverzertifikat signiert ist
- erste Ziffer 1 heisst, es ist das Serverzertifikat und die Zertifikatskette muss zusaetzlich noch valide von einer oeffentlich bekannten CA signiert sein (*empfohlen*)
- erste Ziffer 0 heisst, es ist das CA-Zertifikat und die Zertifikatskette muss zusaetzlich noch von einer oeffentlich bekannten CA signiert sein
- Die zweite Ziffer gibt an, ob im Record das ganze Zertifikat (0) oder nur der Pubkey (1) gehasht/angegeben wird
- Die dritte Ziffer gibt an, welcher Hash-Typ oder ob das komplette Zertifikat direkt im Record steht (empfohlen: 1 - SHA256)
### Pinning auf die FAU-CA
```
_443._tcp.example.com. IN TLSA 0 0 1 989a3aaa5862dede9b42d6f05eabd639a60f5d526c4ae128b98aa18fbc2f0f4a
# aus: openssl x509 -in fau-ca.txt -outform DER | openssl sha256
```
## HTTPS Public Key Pinning (HPKP)
```
<VirtualHost _default_:443>
Use SSLConfig
Header set Cache-Control "no-store, must-revalidate"
# DANGER: remember to add a new certificate in time with a second pin-sha256 statement:
# for testing: only valid for 1h
Header add Public-Key-Pins "pin-sha256=\"Kifsh84a1clurPq6mVDx+O8gbeSPA3zCGXalMAfto6k=\"; max-age=3600"
...
```
- includeSubDomains kann man angeben (mit `;` getrennt nach `max-age`), ist aber meistens eine schlechte Idee, da es hierarchisch weiter unten stehende Webseiten kaputtmacht.
- max-age sollte eigentlich laenger 3600s sein.
- Man sollte mehrere Pins angeben um Reserve-Zertifikate zu haben. Diese erzeugt man wie folgt:
```
openssl genrsa -out ${TARGET}.key.reserve-rsa4096 4096
openssl rsa -in ${TARGET}.key.reserve-rsa4096 -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
```
Falls das eigentliche Zertifikat dann mal kompromittiert wird kann man den Reserve-Key um wie ganz oben beschrieben einen CSR zu erzeugen verwenden.
- Als Absicherung gegen diverse Versionen der kommenden Cryptocalypse kann
man noch andere Typen dazuerzeugen:
```
# langes RSA, leider atm noch zu lang fuer Apple-Produkte
openssl genrsa -out ${TARGET}.key.reserve-rsa8192 8192
openssl rsa -in ${TARGET}.key.reserve-rsa8192 -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
# elliptische Kurven, "die uebliche die alle koennen" aus NSA Suite B:
openssl ecparam -out ${TARGET}.key.reserve-ecdsa-prime256v1 -name prime256v1 -genkey
# andere Kurve, etwas weniger Suspekt auch laut Bernstein:
openssl ecparam -out ${TARGET}.key.reserve-ecdsa-brainpoolP384t1 -name brainpoolP384t1 -genkey
# digests dazu:
openssl pkey -in ${TARGET}.key.reserve-ecdsa-prime256v1 -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
openssl pkey -in ${TARGET}.key.reserve-ecdsa-brainpoolP384t1 -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
```
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment