Howto selbstsigniertes SSL Zertifikat erstellen - Seite 2

Server Zertifikat erstellen

Da wir jetzt ein Root Zertifikat haben, können wir beginnen mit dem erstellen des SSL Server Zertifikats für unsere SSL Applikationen, wie z.B https, spop, simap oder stunnel. Der Ablauf ist so, zuerst erstellen wir ein Privaten Schlüssel und ein Zertifikat Request, diese Signieren wir mit dem Root Zertifikat, dadurch erhalten wir ein gültiges Zertifikat.

Unsere "openssl.cnf" benötigt jetzt ein paar weitere Sektionen um Nicht-CA Zertifikate erstellen zu können.

Füge folgendes ans Ende der Datei:
[ v3_req ]
basicConstraints = CA:FALSE subjectKeyIdentifier = hash
Um zu verhindern das wir jedesmal das gleiche wiederholen müssen auf der Kommandozeile, füge folgendes in die "[ req ]" Sektion nach "distinguished_name":
distinguished_name	= req_distinguished_name
req_extensions = v3_req
Jetzt sind wir bereit um unser erster Zertifikats Request zu erstellen. In diesem Beispiel, erstellen wir ein Zertifikat für einen Sicheren Webserver mit der Domain secure.yourdomain.de. Alles sieht ziemlich ähnlich aus wie beim Root CA Zertifikat, abgesehen von 3 Eingaben welche sich ändern im Zertifikats Request.
  • Organizational Unit: ein Hinweis für was das Zertifikat ist
  • Email Address: die Email Addresse des Webserver Administrators
  • Common Name: Hostname/Domainname für welches das Zertifikat giltet. Zwingend notwendig!
Der Common Name muss zwingend gleich sein wie der Server Name oder Domain Name, mit welchem die Clients auf die Sichere Website zugreifen möchten. Wen dieser Name nicht zusammen passt, bekommen alle Clients die sich mit der SSL geschützen Webseite verbinden möchten, eine Warnung! Die Warnung weisst euch darauf hin, ob ihr diesem Server vertraut und trotzdem nutzen möchten! Die Fehlermeldung die beim Client erscheint: "Warning! You asked for mail.sample.com; the responding machine's certificate is for secure.yourdomain.de. Are you sure you want to continue?"

Es ist auch möglich ein sogenanntes Wildcard Zertifikat zu erstellen für alle Subdomains einer Domain. Zum Beispiel "*.yourdomain.de", somit sind alle Subdomains gültig für diese Domain. Dies wird jedoch in der Regel eher in Reverse Proxy Lösungen benötigt.

Zertifikat Request erstellen (CSR - Certificate Signing Request)

openssl req -new -nodes -out req.pem -config ./openssl.cnf
...
Organizational Unit Name (department, division) []:Secure Webserver Email Address []:webmaster@yourdomain.de Common Name (hostname, IP, or your name) []:secure.yourdomain.de ...
Dies erstellt 2 Dateien:
  • Ein privater Schlüssel in key.pem
  • Ein Zertifikats signier Request in req.pem
Diese Dateien sollten aufbewahrt werden. Wen das zu erstellenden Zertifkat mal abläuft, kann der Request benutzt werden, um erneut ein Zertifikat zu erstellen.
Der Private Schlüssel ist natürlich wichtig für die SSL Verschlüsselung. Wen man die Dateien irgendwo abspeichert, ist es wichtig das man Dateinamen verwendet, durch die man erkennen kann, für was das Zertifikat erstellt wurde; als Beispiel, secure.yourdomain.de.key.pem und secure.yourdomain.de.req.pem.

Der Zertifikats Request sieht so aus:
-----BEGIN CERTIFICATE REQUEST-----
MIICJDCCAY0CAQAwgagxGzAZBgNVBAoTElRoZSBTYW1wbGUgQ29tcGFueTEUMBIG A1UECxMLTWFpbCBTZXJ2ZXIxJDAiBgkqhkiG9w0BCQEWFXBvc3RtYXN0ZXJAc2Ft cGxlLmNvbTETMBEGA1UEBxMKTWV0cm9wb2xpczERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMRgwFgYDVQQDEw9tYWlsLnNhbXBsZS5jb20wgZ8wDQYJKoZI hvcNAQEBBQADgY0AMIGJAoGBAPJhc++WxcBaoDbJpzFbDg42NcOz/ELVFMU4FlPa yUzUO+xXkdFRMPKo54d4Pf1w575Jhlu9lE+kJ8QN2st6JFySbc9QjPwVwl9D2+I3 SSf2kVTu+2Ur5izCPbVAfU0rPZxxK8ELoOkA1uwwjFz6EFuVvnHwlguonWKDtmYW u7KTAgMBAAGgOzA5BgkqhkiG9w0BCQ4xLDAqMAkGA1UdEwQCMAAwHQYDVR0OBBYE FLWaQsUVIQzWr58HtDinH1JfeCheMA0GCSqGSIb3DQEBBAUAA4GBAAbe0jrGEQ3i tyVfy5Lg4/f69rKvDGs+uhZJ9ZRx7Dl92Qq2osE7XrLB1bANmcoEv/ORLZOjWZEY NjMvuz60O7R8GKBrvb/YhAwWhIIt2LJqPkpAEWS0kY0AkoQcfZ7h6oC35+eJ7okg Uu3WuE57RgcNt7/ftr0sG1jUyRwMLvhv -----END CERTIFICATE REQUEST-----
Wir können den Inhalt überprüfen um sicher zu sein, dass unser Request Inhaltlich stimmt bevor wir ihn signieren:

openssl req -in req.pem -text -verify -noout

Server Zertifikat signieren

Jetzt müssen wir noch eine Konfigurations Sektion hinzufügen, damit wir eine Zertifizierungsstelle sind. Ansonsten können wir den Zertifikats Request nicht signieren. Diese Sektion beinhaltet die Pfade zu den verschiedenen Dateien, wie z.B die Datenbank, das Root CA Zertifikat, der Private Schlüssel usw. Es beinhaltet zudem ein paar Standard Werte.

Kopiere den folgenden Inhalt vor die "[ req ]" Sektion in der "openssl.cnf":
[ ca ]
default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem private_key = $dir/private/cakey.pem default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
Um den Request zu signieren, führe den folgenden Befehl aus und beantworte die Ausgaben. Achtung: Das abgefragte Passwort ist das Root CA Passwort, welches wir weiter oben eingegeben haben:

openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
Using configuration from ./openssl.cnf
Enter PEM pass phrase:demo Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows organizationName :PRINTABLE:'The Sample Company' organizationalUnitName:PRINTABLE:'Secure Webserver' emailAddress :IA5STRING:'webmaster@yourdomain.de' localityName :PRINTABLE:'Basel' stateOrProvinceName :PRINTABLE:'Basel-Stadt' countryName :PRINTABLE:'CH' commonName :PRINTABLE:'secure.yourdomain.de' Certificate is to be certified until Dec 8 04:37:38 2002 GMT (365 days) 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
Dies upatet die CA Datenbank und erstellt 2 Dateien:
  • Ein Zertifikat in cert.pem
  • Eine Kopie des Zertifikates in newcerts/.pem
Wir können das Zertifikat wieder anzeigen um den Inhalt zu überprüfen:

openssl x509 -in cert.pem -noout -text -purpose | more
Wie man erkennen kann, enthält das Zertifikat beides, die encodierte Version und die für menschen lesbare Version in der gleichen Datei. Wir können den menschen lesbaren Teil wie folgt heraus löschen.

mv cert.pem tmp.pem
openssl x509 -in tmp.pem -out cert.pem

Server Zertifikat und Key Installieren

Dies hängt von der Applikation ab, für die man das Zertifikat erstellt hat. Einige Applikationen möchten den Schlüssel und das Zertifikat in der gleichen Datei, während andere Applikationen lieber separate Dateien benutzt für den Schlüssel und das Zertifikat. Um den Schlüssel mit dem Zertifikat zu vereinen, kann man diesen Befehl nutzen:

cat key.pem cert.pem >key-cert.pem
Nach diesem Schritt haben wir 3 installierbare Komponenten:
  • Ein Privater Schlüssel in key.pem
  • Ein Zertifikat in cert.pem
  • Ein kombinierter Privater Schlüssel und ein Zertifikat in key-cert.pem
Diese Dateien müssen je nach Applikation in andere Verzeichnisse kopiert werden und üblicherweise in der Konfiguration angegeben werden. Ich werde hier nicht weiter auf die einzelnen Applikationen eingehen.

Root CA Zertifikat verteilen

Wir verteilen das Root CA Zertifikat um zu verhindern, dass die Clients eine Warnung erhalten, dass dieses Zertifikat nicht vertrauenswürdig sei. Dies kann man entweder an die Benutzer der sicheren Website geschickt werden via Email, damit sie das Root CA installieren können. Dadurch verschwindet die Warnmeldung.

Zertifikat erneuern

Es gibt zwei Möglichkeiten, warum ihr Zertifikat erneuert werden muss:
  • Das signierte Zertifikat ist abgelaufen.
  • Das Root Zertifikat mit dem das Zertifikat signiert wurde ist abgelaufen.

Zertifikat wiederrufen

Das Zertifikat muss zuerst wiederrufen werden, ansonsten kann man nicht ein Zertifikat mit dem gleichen "Common Name" erneut ausstellen. Das Zertifikat findet ihr im "newcerts" Verzeichnis; Der Dateiname kann man herausfinden in dem man in der "index.txt" nach dem "Common Name (CN)" sucht. Der Dateiname ist der Index plus die Dateiendung ".pem", als Beispiel "02.pem".

Um das Zertifikat zurückzuziehen benutzt den folgenden Befehl:

openssl ca -revoke newcerts/02.pem -config ./openssl.cnf
Ausgabe:
Using configuration from ./openssl.cnf
Enter PEM pass phrase: demo Revoking Certificate 02. Data Base Updated
Nun ist das Zertifikat zurückgezogen und wir können beginnen mit dem neusignieren des Original Request (CSR), denn wir weiter oben erstellt haben. Ihr könnt auch einfach ein neuen Request erstellen und diesen wie oben beschrieben signieren.

Kommerziell signiertes Zertifikat erstellen

Der Ablauf ist im Prinzip der gleiche wie oben beschrieben, ausser das wir nicht selber das Kommerzielle Zertifikat signieren. Wir benötigen dazu auch eine Zertifikats Anfrage (CSR), diesen Zertifikats Anfrage müssen wir der Zertifizierungsstelle übermitteln (VeriSign, RapidSSL, cacert.org usw.) Nach dem übermitteln des Zertifikat Requests, erhält man das signierte Zertifikat wieder und kann es wie gewohnt installieren. Bei gewissen SSL Zertifizierungsstelle kann man den CSR in ein Textfeld auf ihrer Website kopieren und erhält direkt das signierte Zertifikat. Ist einfach eine Kostenfrage, wobei anzumerken ist, das CACert.org kostenlos Zertifikate signiert. Leider ist CACert.org noch nicht in allen Mainstream Browsern verfügbar und muss wie das selbst signierte Root CA Zertifikat importiert werden.

Die Kostenpflichtigen Zertifizierungsstellen sind in den Mainstream Browsern vorhanden, dadurch sind die signierten Zertifkate direkt als Vertrauenswürdig eingestuft ohne das der Client noch was importieren muss. Der Nachteil ist, es kostet Geld und dies unter umständen nicht gerade wenig!

CA Zertifikat als Download anbieten

Eine Möglichkeit um sein Root Zertifikat zur Verfügung zu stellen, ist man bietet es zum Download an. Wen man dies machen möchte, sollte man beachten das man auch eine Zertifikats Annulierungsliste (Certificat Revocation List - CRL) zum Download anbietet sollte.

Wer Apache2 nutzt muss das Zertifikat als Datei mit der Dateiendung .crt anbieten oder die "mime.types" entsprechend anpassen, letzeres würde ich jedoch nicht empfehlen.

Wie ich weiter oben bereits erwähnt habe kann man das Zertifikat als Downloadlink anbieten. Läd ein Client das Zertifikat herunter, offeriert der Browser dem Benutzer die Installation des Zertifikates für ihn zu übernehmen.

cp cacert.pem /srv/htdocs/yourDomain/secure/downloads/MeinRootCA.crt
Nun müssen wir die Dateirechte ändern, damit der Webserver es lesen kann.

chown www.www /srv/htdocs/yourDomain/secure/downloads/MeinRootCA.crt
Jetzt kann man die Datei direkt mit seinem Browser installieren.

http://secure.yourdomain.de/MeinRootCA.crt

Zertifikats Annulierungsliste (Certificat Revocation List - CRL) erstellen

Die Annulierungsliste kann man wie folgt generieren:

openssl ca -gencrl -crldays 31 -config ./openssl.cnf -out rootca.crl
Die Zertifikate kann man nun für jede beliebige SSL-fähige Applikation nutzen, solange der Hostname oder Domainname überreinstimmt! Das wäre eigentlich alles, hoffe dies erspart einigen den Ärger mit dem Erstellen der gültigen Zertifikate.

Copyright: deutsche Übersetzung und Erweiterung von Hack2learn.org - Englisches Original Howto kann man hier lesen: zum Howto

11 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: tini

Ein andere Möglichkeit für das Verwalten von selbstsignierten Zertifikaten ist GnoMint: http://gnomint.sourceforge.net/


Von: DeaD_EyE

Gutes Tutorial. Du hast noch einen Tippfehler im Code:

chown www.www /srv/htdocs/yourDomain/secure/downloads/MeinRootCA.crt

User und Gruppe werden mit einem Doppelpunkt getrennt.


Von: Joern

Leider bekomme ich nach dem Ausführen von

$ openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf

diese Fehlermdeldung:

Error Loading extension section v3_ca

Jemand eine Idee, wie ich dies beheben kann?


Von: griesgram

Hy,

Danke erstmal für die Kommentare,

@ Dead_EyE: unter Debian kannst du es auch mit einem Punkt angeben, funktioniert auch. Danke für den Hinweis.

@ Joern: Kann es sein das in der openssl.cnf bei dir folgende Sektion fehlt:

"[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always" ?

grüsse aus Basel


Von: renekuehn

Der Befehl das Zertifikat anzuzeigen müsste lauten

Das CA Zertifikat anzeigen:
cat /home/username/CA/cacert.pem


Von: Joern

Hi,
mein Fehler ist beim Copy&Paste passiert.
Beim Anlegen der openssl.cnf habe ich nicht bemerkt, dass jeder Zeile ein # vorangestellt wurde ;-)
Konnte nun das Zertifikat erstellen!
Allerdings würde ich mich nun darüber freuen, wenn vielleicht noch kurz im T´HowTo darauf eingegangen werden könnte, wie man das erstellte Zertifikat nun installiert.
Und wie dies für weitere Mailserver funktionieren könnte :-)

Viele Grüße,

Joern


Von: Lafogo

Hallo,

Ich habe da mal eine Frage ich habe alles so gemacht wie es hier beschrieben wird aber es geht einfach nicht wenn ich meine Webseite aufrufe über https kommt der Fehler: (Die Webseite kann nicht angezeigt werden.) was kann das sein?

Mfg


Von: happyfeet

Hallo,

hab echt alles so gemacht wie beschrieben. Komme aber nur bis zu diesem Punkt:
openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem

da bekomme ich diesen Fehler:


Error opening CA certificate ./cacert.pem
140127161779872:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('./cacert.pem','r')
140127161779872:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
unable to load certificate

An welchem Schritt habe ich was falsch gemacht das die cacert.pem nicht existiert?

Gruss Lars


Von: franc

Also das:

default_md = md5

ist doch unsicher und längst veraltet, siehe:

http://www.ubuntu.com/usn/usn-179-1/


Von: rep-o

Ich kann mich meinem Vorredner nur anschließen.
Folgende Parameter sollten geändert werden.

default_bits = 2048 # Size of keys
default_md = sha256 # message digest algorithm

Besser wären soger 4096 und sha512 zu verwenden.

Fals der Author das liest, bitte ändern. 1024 und md5 sind nicht merh zeitgemäß.


Von: walaw

Hallo - zwei Probleme! Um den Wert 01 in serial zu schreiben, muss der user der gruppe dialout angehören - das wurde hier nicht deutlich! Sonst quittiert er mit "permission denied"! Siehe -> http://jesin.tk/fix-serial-port-permission-denied-errors-linux/

Bei der Eingabe des folg. Kommandos: sudo openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
bekomme ich folgende Meldung:

--------
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName :PRINTABLE:'dxx.scxxx.oxx'
localityName :PRINTABLE:'FX'
stateOrProvinceName :PRINTABLE:'XH'
countryName :PRINTABLE:'DE'
The commonName field needed to be supplied and was missing
----

- Wie kann ich das Problem lösen? Komme leider nicht weiter :(
- Es wäre schöne wenn das HowTo noch einmal überarbeitet wird - auch die Keylänge auf min. 2048 erhöht und inkl. sicherem Algorithmus.