Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

SSL Zertifikate selbst signieren – 2/2

So weit, so schön?
Gut, gut, dann legen wir mal mit dem trockenen, praktischen Teil los…
Diese Anleitung basiert auf https://help.ubuntu.com/community/OpenSSL, ist aber an einigen Punkten modifiziert worden…
Eine große Hilfe waren die SSL-Labs und ihre PDF-Anleitung mit Tipps und ‚Best Practice‘ Empfehlungen bei der Implementierung von SSL/TLS. [Update: Link nicht mehr verfügbar :/]

Da SSL sehr alt ist, findet man natürlich auch eine Tonne Anleitungen dafür. Und früher waren einige Algorithmen noch ganz OK, die heute nicht mehr sicher sind bzw. grenzwertig an ‚Unsicher!‘ laufen. Ich habe mich bemüht, an diesen Stellen aktuellere Chiffren einzufügen.

Bei der caconfig.cnf verwende ich „whirlpool“. Das scheint auch zu klappen. Und mir ist Whirlpool lieber als SHA-512, da dieser Hash-Algo direkt von der NSA entwickelt worden ist. Ob das allerdings der Weisheit letzter Schluss ist…? Meine Admins meinen, wenn kein Fehler kommt, würde es schon gehen. Es kam kein Fehler. Ein Vorabtest bei den SSL-Labs hat auch funktioniert und der Hash-Algo wurde nicht bemängelt. Das Einzige, das mich stört ist, dass eben nicht „Whirlpool“ angezeigt wird, sonder „0.0“…

Ansonsten ist die Zertifikat-Geschichte ein wenig wie das Erstellen von Schlüsselpaaren mit PuttyGEN. Beim ersten Mal ist alles neu und ‚magisch‘. Teilweise auch ‚unbegreiflich‘ und kompliziert. Aber nachdem wir ein paar Schlüssel gemacht haben, verliert das Ganze seinen Schrecken. Mit den Zertifikaten ist das genau so :)

Vorbereitungen

Per SSH als „User“ auf unseren Server verbinden.

Root-Rechte erlangen
sudo -i

Aktuelle OpenSSL Version herausfinden
apt-get update && apt-cache search libssl | grep SSL

OpenSSL installieren
(Zum derzeitigen Stand aktuelle Version! Kann in Deinem Fall schon eine neuere sein…)
apt-get install libssl1.0.0
### Wenn Du das Basissystem installiert hast, ist OpenSSL schon drauf und hoffentlich auch aktuell ;)

Übersicht über die verwendete Version

Liste aller verfügbaren OpenSSL Sub-Kommandos ausgeben
openssl help

Für den Fall: Um genauere Informationen zu jedem Unter-Befehl zu bekommen, benutzt Du den openssl-Befehl gefolgt von der „-h“ Option und dem Sub-Kommando, zu dem Du die Informationen braucht. Besiplielhaft würde der Befehl zum Anzeigen genauerer Informationen des „enc“ Unter-Befehls so aussehen…
openssl -h enc

Bitte die Version, die Chiffren und den Speedtest per [Copy/Paste] in Deine Dokumentation einfügen. Das hilft, wenn Du später mal was nachsehen musst…

Installierte OpenSSL Version ausgeben
openssl version
### OpenSSL 1.0.1e 11 Feb 2013

Liste alle verfügbaren Chiffrier-Algorithmen auf
openssl ciphers -v

Mit folgendem Befehl führst Du einen Geschwindigkeitstest der verschiedenen Chiffren durch. Im Anschluss an den Test wird Dir eine Liste mit der Dauer bzw. den Signier/Verifizier Zyklen pro Sekunde angezeigt:
openssl speed
### Dauert ein paar Minuten…

Wir bauen uns eine CA!

Umgebung vorbereiten
cd && mkdir -p CA/certs && mkdir CA/private && mkdir CA/configs && cd CA
### Diese Befehle legen die Verzeichnisstruktur an und wechseln in das „CA“-Verzeichnis.

echo '01' > serial && touch index.txt
### Die Datei „serial“ wird erzeugt und hinein wird „01“ geschrieben. Dann wird eine leere Datei „index.txt“ angelegt.

Basis Konfiguration anlegen
nano caconfig.cnf
——————- SNIP IT —————————–
Bitte caconfig.cnf.txt verwenden. Die Config ist recht lang…
———————————————————

Root Zertifikat erstellen

export OPENSSL_CONF=/root/CA/caconfig.cnf

openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 3650

Hier brauchen wir ein Passwort für die root-CA (4-102 Stellen gehen)
Am Besten eins der vorbereiteten 64 Zeichen PWs verwenden…

openssl x509 -in cacert.pem -out cacert.crt

### Zu diesem Zeitpunkt haben wie eine funktionierende CA! :-)

Die eigene Root-CA noch im System bekannt machen
cp cacert.pem /usr/share/ca-certificates/rootCA.crt

nano /etc/ca-certificates.conf
ssl-etc-ca-certificates-conf
### Hier nach den Kommentaren (direkt unterhalb der Rauten „#“) oben gleich als Erstes unser ‚rootCA.crt‚ eintragen! Never trust the other ones ;)

Zertifikate neu einlesen
update-ca-certificates

### Updating certificates in /etc/ssl/certs… 1 added, 0 removed; done.
### Running hooks in /etc/ca-certificates/update.d….done.

Jetzt ist das rootCA im ganzen System bekannt und kann auch intern verwendet werden.

Anlegen eines Wildcard SSL Zetifikates (zur Veranschaulichung)

Wir werden nun ein SSL Zertifikat für den VirtualHost „bla.de“ erstellen und mit unserer eigenen CA signieren. Diese Zertifikate brauchen wir dann zur späteren Verwendung in NginX, unserem Webserver.
Für jedes Zertifikat (also jede Domain, die Du auf dem Server haben möchtest) wird eine eigene Config Datei angelegt…

Die Werte in [ server_distinguished_name ] musst Du natürlich an Deine Umgebung anpassen. Vor allem der Wert „commonNameMUSS mit dem ‚hostname‚ oder ‚CNAME‚ (Domain-Namen) übereinstimmen, für den Du das Zertifikat anlegst. Stimmt Domain und commonName nicht überein, bekommst Du im Webbrowser beim Betrachten der Seite „Mismatch“-Fehler ausgespuckt. Das macht Deine Gäste nervös und sie werden die Seite schnell verlassen wollen.
Andererseits machen wir selbst signierte Zertifikate nicht auf öffentlichen Bereichen, wegen der Vertrauens-Probleme und der Fehlermeldung…

cd /root/CA
nano bla.de-vhost.cnf
——————- SNIP IT —————————–
#
# bla.de-vhost.cnf - Zertifikatsvorlage
#
[ req ]
prompt = no
distinguished_name = server_distinguished_name
req_extensions = v3_req
#
[ server_distinguished_name ]
commonName = bla.de
stateOrProvinceName = BY
countryName = DE
emailAddress = postmaster@bla.de
organizationName = bla.de IT
organizationalUnitName = Hello IT!
#
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
#
[ alt_names ]
DNS.0 = bla.de
DNS.1 = *.bla.de

———————————————————
### Wildcard Zertifikat (*.)
### Wenn Du genau weißt, was Du brauchst, solltest Du hier besser weitere Unterpunkte anlegen und kein Wildcard vergeben…

Erstellen des Zertifikatrequests
export OPENSSL_CONF=/root/CA/bla.de-vhost.cnf

openssl req -newkey rsa:2048 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
### Enter PEM pass phrase: Irgendwas vergeben. Wird wieder entfernt! [1234]
### Verifying – Enter PEM pass phrase: [1234]

Passwort aus dem Private Key wieder entfernen
openssl rsa < tempkey.pem > bla.de-vhost.key
### Enter pass phrase: [1234]

Singieren des Zertifikatrequests
export OPENSSL_CONF=/root/CA/caconfig.cnf

openssl ca -in tempreq.pem -out bla.de-vhost.crt
### Enter pass phrase for /root/CA/private/cakey.pem: [Hier das Passwort der CA: Siehe oben!]

[* * * * Bildschirmausgabe * * * *]

Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
commonName :T61STRING:’bla.de‘
stateOrProvinceName :PRINTABLE:’BY‘
countryName :PRINTABLE:’DE‘
emailAddress :IA5STRING:’postmaster@bla.de‘
organizationName :PRINTABLE:’bla.de IT‘
organizationalUnitName:PRINTABLE:’Hello IT!‘
Certificate is to be certified until Jul 8 17:41:00 2025 GMT (3650 days)

Sign the certificate? [y/n]: [y] und [Enter]
– 1 out of 1 certificate requests certified, commit? [y/n]: [y] und [Enter] – Ja, noch mal…

[* * * * Bildschirmausgabe ENDE * * * *]

FERTIG! Das Zertifikat ist signiert – also quasi ’scharf geschaltet‘ und einsatzbereit!

Noch a bissl aufräumen
rm -f tempkey.pem tempreq.pem && mv bla.de-vhost.crt certs/ && mv bla.de-vhost.key private/ && mv bla.de-vhost.cnf configs/
### Löscht den tempkey und temprequest und verschiebt das Zertifikat in „certs“, den Key in „private“ und die Config nach „configs“.

Im Webserver-Kapitel bauen wir die Zertifikate dann in die Config der Webseiten ein :)

Anzeige *

6 Kommentare zu „SSL Zertifikate selbst signieren – 2/2“

  1. Ist zwar nett beschrieben, funktioniert aber einfach nicht mehr =/

    unable to load certificate
    140639883634320:error:0D0C40D8:asn1 encoding routines:c2i_ASN1_OBJECT:invalid object encoding:a_object.c:287:
    140639883634320:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:699:Field=algorithm, Type=X509_ALGOR
    140639883634320:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:699:Field=signature, Type=X509_CINF
    140639883634320:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:699:Field=cert_info, Type=X509
    140639883634320:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:

    irgend nen Vorschlag?

      1. Beim Signieren!
        Singieren des Zertifikatrequests
        export OPENSSL_CONF=/root/CA/caconfig.cnf

        Ums ganz genau zu nehmen nach diesem Command!

        openssl ca -in tempreq.pem -out bla.de-vhost.crt

        1. Das ist komisch. Wenn Du die CA schon so weit gebaut hast, müsste sie eigentlich an dieser Stelle auch funktionieren.
          Du hast genau die gleiche Umgebung, wie im Tutorial? Also Debian Wheezy und die CA genau wie beschrieben eingerichtet?

          1. Okay ich faile xD
            Die CA so eingerichtet ja… Aber leider auch gedacht man könnte es problemlos auf jessie übertragen… Ein Trugschluss…

            Irgend einen Lösungsvorschlag?

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.