Zum Inhalt springen

Eigene Zertifizierungsstelle mit OpenSSL unter Windows

  • von

OpenSSL ist eine Werkzeugkiste für Verschlüsselung, die von einer Gemeinschaft freier Software-Entwickler gewartet wird.

Vernünftige Verschlüsselung basiert im Kern auf einer gemeinsamen Vertrauensbasis, der sowohl Sender als auch Empfänger vertrauen können. Diese Basis ist die Zertifizierungsstelle.
Mit OpenSSL lässt sich so eine Zertifizierungsstelle lokal aufbauen. In dieser Beschreibung geht es um die erforderlichen Schritte für das Setup und die Nutzung.

Wenn man den Code unter GitHub nicht selber kompilieren möchte, kann man z.B. auf die für Windows bereitgestellten Binaries von Viktor Szakats zugreifen.

Aktuelle gezippte Version herunterladen und in einen Ordner kopieren:

c:\Program Files\OpenSSL

Schritte im OpenSSL-Ordner ausführen:

md CA
cd CA
md certs
md crl
md csr
md newcerts
md private
copy NUL index.txt
echo 01 > crlnumber
echo 01 > serial
move ..\openssl.cnf.dist openssl.cfg

In diesem Beispiel wird als geheimes Passwort „secret“ verwendet. Dieser sollte besser ersetzt werden durch einen geheimen Schlüssel.

Jetzt kommt der verzwickte Teil!

Anpassung der openssl.cfg

Passwort ersetzen:

[ req ]
input_password = secret
output_password = secret

Eigene Daten eintragen: Land, Ort, Name…

[ req_distinguished_name ]
[ usr_cert ] = Bereich für Email-Zertifikate
[ server_cert ] = Bereich für Server-Zertifikate (https)

Adresse einer von extern erreichbaren URL für die Zertifikatsüberprüfung:

nsCaRevocationUrl = http://www.meine.adresse.de/CA.crl

Wenn ein Zertifikat im Umlauf ist, sollte jeder die Möglichkeit haben zu prüfen, ob das Zertifikat von der Zertifizierungsstelle immer noch als gültig eingestuft wird. Das passiert z.B. anhand einer CRL (Certificate Revocation List). Zu Anfang ist diese Liste leer. Sollte aber ein Zertifikat in falsche Hände gelangen, wird es für ungültig erklärt und auf dieser Liste veröffentlicht.
OpenSSL erstellt so eine CRL-Datei, die auf einem Webserver veröffentlicht werden sollte.

Als Beispiel kann diese Datei als Vorlage verwendet werden: openssl.cfg

OpenSSL Aufrufe

Privaten Schlüssel erzeugen:

..\openssl genrsa -out private\CA.key.pem -aes256 4096
Enter pass phrase for private\CA.key.pem: secret
Verifying - Enter pass phrase for private\CA.key.pem: secret

Der private Schlüssel CA.key.pem ist das Herzstück der Zertifizierungsstelle und sollte besonders sicher aufbewahrt werden!

Öffentlicher Schlüssel der Zertifizierungsstelle:

.\openssl req -config openssl.cfg -key private\CA.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs\CA.cert.pem

Country Name (2 letter code) [DE]:
State or Province Name (full name) [Bundesland]:
Locality Name (eg, city) [Stadt]:
Organization Name (eg, company) [Firma]:
Organizational Unit Name (eg, section) [IT]:
Common Name (e.g. server FQDN or YOUR name) []:Meine CA
Email Address []:ca@mail.de

.Überprüfen des Zertifikats:

..\openssl x509 -noout -text -in certs\CA.cert.pem

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
76:93:d4:2a:5e:f8:3f:26:bd:a9:be:ef:65:d9:74:06:2f:1d:3a:77
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = DE, ST = Bundesland, L = Stadt, O = Firma, OU = IT, CN = Meine CA, emailAddress = ca@mail.de
Validity
Not Before: May 3 11:01:33 2020 GMT
Not After : Apr 28 11:01:33 2040 GMT
Subject: C = DE, ST = Bundesland, L = Stadt, O = Firma, OU = IT, CN = Meine CA, emailAddress = ca@mail.de

certs\CA.cert.pem ist der öffentliche Schlüssel, der allen Anwendern zur Verfügung gestellt werden muss. Z.B. unter:
http://www.meine.adresse.de/CA.cert.pem

Zertifikate ausstellen mit der Zertifizierungsstelle

Neues Email-Zertifikat erstellen für me@mail.de

Das Email-Zertifikat kann auch für die Code-Signatur (Setups) verwendet werden.

private key:

..\openssl genrsa -aes256 -passout pass:secret -out private\me_mail.de.key.pem 2048

Certificate Request (Antrag auf neues Zertifkat) erstllen:

..\openssl req -config openssl.cfg -key private\me_mail.de.key.pem -passin pass:secret -passout pass:secret -new -sha256 -out csr\me_mail.de.csr.pem

Country Name (2 letter code) [DE]:
State or Province Name (full name) [Bundesland]:
Locality Name (eg, city) [Stadt]:
Organization Name (eg, company) [Firma]:
Organizational Unit Name (eg, section) [IT]:
Common Name (e.g. server FQDN or YOUR name) []:Vorname Nachname
Email Address []:me@mail.de

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:secret
An optional company name []:Firma

Zertifikat ausstellen:

..\openssl ca -config openssl.cfg -extensions usr_cert -days 365 -notext -md sha256 -in csr\me_mail.de.csr.pem -passin pass:secret -out certs\me_mail.de.1.cert.pem

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Exportieren für die Nutzung unter Windows:

..\openssl pkcs12 -export -out me_mail.de.1.pfx -in certs\me_mail.de.1.cert.pem -inkey private\me_mail.de.key.pem -passin pass:secret -passout pass:secret

HTTPS Zertifikat erstellen

Verschlüsselung für https://www.irgendwo.de

privater Schlüssel:

..\openssl genrsa -aes256 -passout pass:secret -out private\www.irgendwo.de.key.pem 2048

Certificate Request:

..\openssl req -config openssl.cfg -key private\www.irgendwo.de.key.pem -passin pass:secret -passout pass:secret -new -sha256 -out csr\www.irgendwo.de.csr.pem

Country Name (2 letter code) [DE]:
State or Province Name (full name) [Bundesland]:
Locality Name (eg, city) [Stadt]:
Organization Name (eg, company) [Firma]:
Organizational Unit Name (eg, section) [IT]:
Common Name (e.g. server FQDN or YOUR name) []:www.irgendwo.de
Email Address []:me@irgendwo.de

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:secret
An optional company name []:Firma

Zertifikat ausstellen:

..\openssl ca -config openssl.cfg -extensions server_cert -days 730 -notext -md sha256 -in csr\www.irgendwo.de.csr.pem -passin pass:secret -out certs\www.irgendwo.de.1.cert.pem

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

PFX Datei erstellen für Windows-Server:

..\openssl pkcs12 -export -out www.irgendwo.de.1.pfx -in certs\www.irgendwo.de.1.cert.pem -inkey private\www.irgendwo.de.key.pem -passin pass:secret -passout pass:secret

Zertifikat zurückziehen

Wenn ein Zertifikat ungültig geworden ist, kann es vor dem Ablaufdatum zurückgezogen werden:

..\openssl ca -config openssl.cfg -revoke certs\www.irgendwo.de.1.cert.pem

CRL Datei erstellen

..\openssl ca -config openssl.cfg -gencrl -out crl\CA.crl
Enter pass phrase for ../CA/private/CA.key.pem: secret

..\openssl crl -in crl\CA.crl -noout -text

Alle ungültigen Zertifikate werden in der CRL-Datei signiert abgelegt. Diese CRL Datei sollte immer turnusmäßig aktualisiert werden, da auch sie eine begrenzte Gültigkeit hat.

Fazit

Hoffentlich ist alles fehlerfrei und verständlich. Solltet ihr Anmerkungen haben oder euch ein Fehler auffallen, dann bitte gerne in den Kommentaren schreiben. Vielen Dank!

Schlagwörter:

Schreibe einen Kommentar