Hitchhiker’s Guide To Certificates


Der Vortrag über openSSL ist nun Online: Hitchhiker’s Guide to Certificates

Die Skripte gibt es nach dem Klick:

RSA Schlüssel erzeugen

> openssl genrsa -out foo.key 4096
Generating RSA private key, 4096 bit long modulus
.........................................................................++
..................++
e is 65537 (0x010001)

CSR erzeugen

> openssl req -new -sha256 -utf8 -key foo.key -out foo.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Hesse
Locality Name (eg, city) []:Kassel
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Polyas GmbH
Organizational Unit Name (eg, section) []:Test
Common Name (e.g. server FQDN or YOUR name) []:localhost
...

CSR anzeigen

openssl req -text -in foo.csr

CSR via Skript

req.conf:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = DE
ST = Hesse
L = Kassel
O = Polyas GmbH
OU = Tests
CN = localhost
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1=foobar
IP.1=1.2.3.4
openssl req -new -sha256 -utf8 -key foo.key -out foo.csr -config req.conf

Konvertierung PEM <-> DER

openssl x509 -in foo.crt -outform der -out foo.der
openssl x509 -in foo.der -inform der -out foo.pem

Private Key in PKCS#8

openssl pkcs8 -in foo.key -out foo.p8

Private Key + Chain in PKCS#12

openssl pkcs12 -in foo.key -CAfile chain.pem -nodes -chain -out identity.p12

Public Key nach Raw-Format

Wird z.B. für dgst -verify benötigt:

openssl x509 -pubkey -noout -in foo.crt > pubkey.pem

Self-signed Zertifikat

openssl req -newkey rsa:4096 -utf8 -nodes -keyout foo.key -x509 -days 365 -out foo.crt

Kurzform von:

openssl genrsa -out foo.key 4096
openssl req -new -sha256 -utf8 -key foo.key -out foo.csr
openssl x509 -req -sha256 -days 365 -in foo.csr -signkey foo.key -out foo.crt

Zertifikat anschauen:

openssl x509 -text -noout -in foo.crt

Eigene Root-CA

openssl req -x509 -new -sha256 -utf8 -extensions v3_ca \
        -subj "/C=DE/ST=Hesse/L=Kassel/O=Wolfgang Jung/OU=CA/CN=Wolfgang Jung CA" \
        -key selfSignCA.key -days 10000 -out selfSignCA.crt
openssl pkcs12 -export -inkey selfSignCA.key -in selfSignCA.crt \
        -out selfSignCA.p12

Signieren mit der eigenen Root-CA

openssl x509 -req -sha256 -in foo.csr \ 
        -CA "${CA_DIR}/selfSignCA.crt" -CAkey "${CA_DIR}/selfSignCA.key" \
        -CAcreateserial -CAserial "${CA_DIR}/selfSignCA.srl" \
        -out foo.crt -days 10000 -extfile sign.conf \
        -extensions v3_req

Die Datei sign.conf muss die zusätzlichen Infos zum signieren enthalten:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
C = DE
ST = Hesse
L = Kassel
O = Wolfgang Jung
OU = foobar
CN = foobar

[v3_req]
keyUsage = critical,keyEncipherment, dataEncipherment, digitalSignature
extendedKeyUsage = critical,serverAuth,clientAuth,emailProtection
basicConstraints = critical,CA:FALSE
subjectAltName = @alt_names
[alt_names]
DNS.1 = foobar
DNS.2 = foobar.local

Wichtig: Chrome setzt für HTTP-TLS Verbindungen voraus, dass mindestens der CN noch als primärer DNS alt_name vorhanden ist, siehe auch rfc2818

Weitere, zulässige alt_names (siehe auch openssl doc zu x509v3_config)

Eine CA ist keine PKI!

Neben dem Ausstellen der Zertifikate sollte eine CA auch Zertifikate zurückrufen können. Dies setzt aber entweder den Betrieb eines Webservers für die CRL (Certificate Revocation Lists) oder eines Servers für OCSP (Online Certificate Status Protocol).

Dafür entweder ein fertiges Produkt openXPKI oder via pki-server (Debian): dogtagpki.

TLS

openssl als TLS-Client

openssl s_client -connect google.de:443 -servername google.de -showcerts

openssl als TLS-Server

openssl s_server -accept 9992 \
        -key foo.key \
        -cert foo.crt \
        -CAfile selfSignCA.crt -WWW

Mit der Option -verify n (Client-Zertifikate kann mitgeliefert werden) bzw. -Verify n (Zertifikat muss vom Client mitgeliefert werden) ist ein Client Zertifikat dann gültig, wenn n-Zertifizierungsstellen zwischen diesem und einer der openssl bekannten Root-CA liegen.

Üblicherweise ist n=1 (Clients werden direkt von einer Root-CA signiert) oder 2 (Client werden von einer Intermediate CA signiert).

openssl s_server -accept 9992 -Verify 1 \
        -key foo.key \
        -cert foo.crt \
        -CAfile selfSignCA.crt -WWW
openssl s_client -connect pong:9992 
        -key w.jung@wolfgang-jung.net.key \
        -cert w.jung@wolfgang-jung.net.crt 
        -CAfile selfSignCA.crt

Sonstiges

Prüfsummen/Signaturen

openssl dgst -r -sha384 file
> f861caf733f5dab899c6903a7f1aedd12bd4e4dde7c76e8afcf9e07cd984579dd668a60c9defee0a6490b3294972681f *file
openssl dgst -r -sha384 -hmac MySecretKey file
> b398e60376030fbe3f3998b9495ac21e32238ec85ed8158465adb001c9a8defa3bc2641feb8e67703f3b2f90f13990dc *file
openssl dgst -r -sha384 -sign foo.key -out sig file
openssl dgst -r -sha384 -verify pubkey.pem -signature sig file
> Verified OK

Verschlüsselung

openssl aes-128-cbc -k SharedKey -e -a < file
> U2FsdGVkX19wedpEWuvRd1kwUnrC6DCK5qkRqeuxffk=
openssl aes-128-cbc -k SharedKey -d -a
> Mein Text

Zufall

openssl rand -hex 16
> 8ccd23881e30f1115b84c633c557f6c2

Skript zur Anlage einer CA

Aufruf zur Anlage einer CA im Verzeichnis $PWD/caDir:

./generateCA.sh -ca $PWD/caDir

Erzeugung Keys/Certs/P12 für einen CN:

Der weiter oben beschriebene Mechanismus zur Erzeugung eines Zertifikats durch die eigene CA ist in dem folgenden Skript zusammengefasst:

Beispielaufruf zur Anlage eines Zertifikats für die CNs foo.priv und bar.priv:

./generateKeyAndCSR.sh -ca $PWD/caDir foo.priv,bar.priv 'sample cert'

Die Org-Unit ist dabei auf sample cert gesetzt. Andere Angaben im Zertifikat lassen sich als Parameter mitgeben:

./generateKeyAndCSR.sh [-ca CA-directory] [-pwd] CN[,subjectAltNames,subjectAltIPs]\* [Country State Localization Organization] OrgUnit

Das Kennwort ist, falls der Parameter -pwd nicht angegben ist, changeit.

Falls kein CA-directory angegeben ist, wird ein self-signed Zertifikat mit 30 tägiger Laufzeit erstellt.

Kommentare per Mail an post@wolfgang-jung.net.