Howto selbstsigniertes SSL Zertifikat erstellen

Wer kennt es nicht, man möchte gerne seinen Mailserver oder Webserver absichern mit SSL, weiss aber nicht wie er die SSL Zertifikate erstellen soll. Durch das benutzen von SSL wird die Kommunikation zwischen Client und Server verschlüsselt. Dadurch werden alle Daten, wie zum Beispiel Passwörter, Email Inhalte verschlüsselt übertragen. Der Vorteil von selbst signierten Zertifikaten gegenüber gekauften ist ganz einfach, sie kosten NICHTS! Um dies zu bewerkstelligen, benötigt man Openssl und in unserem Fall eine Linux Machine. In diesem Howto wird ein Debian Lenny 64Bit benutzt. Geht aber genau so mit anderen Distribution und Debian Versionen. Theoretisch würde es auch mit Windows funktionieren - wird hier aber nicht näher behandelt :p

Das Ziel dieses Howto ist es, das man am Schluss eine Zertifizierungsstelle (Root CA) besitzt, mit der man beliebig viele selbst signierte Zertifikate erstellen kann.

Voraussetzungen

  • OpenSSL
  • Linux System (In diesem Howto benutzt: Debian Lenny 64Bit)

Openssl installieren

Damit wir überhaupt SSL Zertifikate erstellen können, müssen wir OpenSSL installieren. Installiert OpenSSL mit folgendem Befehl:

aptitude install openssl

benötigte Dateien und Ordner erstellen

Als erstes müssen wir eine Zertifizierungsstelle (Root CA) erstellen. Diese wird benötigt damit wir unsere Zertifikate mit uns selber signieren können. Nur so haben wir gültige Zertifikate.

Erstellt die folgenden Ordner und Dateien in eurem home Verzeichnis.

cd /home/username
mkdir CA
cd CA
mkdir newcerts private

Das CA Verzeichnis hat folgenden Inhalt:
  • CA Zertifikat
  • Die Datenbank mit den signierten Zertifikaten
  • Die Schlüssel, Requests und Zertifikate die wir generieren
Es ist zudem unser Arbeitsverzeichnis wen wir Zertifikate erstellen und signieren.

Das CA/newcerts Verzeichnis beinhaltet:
  • Eine Kopie von jedem signierten Zertifikat
Das CA/private Verzeichnis beinhaltet:
  • Unseren Privaten und geheimen CA Schlüssel
Dieser Schlüssel ist sehr wichtig! Ohne diesen Schlüssel kann man keine Zertifikate signieren oder erneuern! Verliert ihn also auf keinen Fall! Zudem passt auf das dieser Schlüssel nur durch Root gelesen werden kann und nicht in falsche Hände kommt! Ansonsten könnt ihr alle Zertifikate zurückziehen und von Vorne anfangen.

Beim nächsten Schritt erstellen wir 2 Dateien die zum signieren der Zertifikate benötigt werden:

echo '01' >serial
touch index.txt

Konfigurationsdatei erstellen

Erstellt eine neue Konfigurationsdatei "openssl.cnf".

vim /home/username/CA/openssl.cnf
mit folgendem Inhalt:
#
# OpenSSL configuration file. # # Establish working directory. dir = .

Root CA Zertifikat erstellen

Jetzt können wir mit dem erstellen des Root CA Zertifikats beginnen. Aber zuerst noch ein paar Details zur Konfiguration.

Die Konfigurationsdatei ist dazu da, das man nicht so viele Parameter in der Kommandozeile eingeben muss. Zudem ist die Konfigurationsdatei in Sektionen aufgeteilt, sie werden je nach Angabe von Kommandozeilen Argumenten, gelesen und verarbeitet. Ein Name in "Eckigen Klammern", z.B "[ req ]", zeigt das eine Sektion beginnt.

Wir benötigen nun eine Sektion zum überprüfen der Zertifikate und eine Sektion welche definiert was für ein Typ Zertifikat wir erstellen möchten.

Füge folgendes zu der neuen "openssl.cnf" hinzu:
[ req ]
default_bits = 1024 # Size of keys default_keyfile = key.pem # name of generated keys default_md = md5 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name [ req_distinguished_name ] # Variable name Prompt string #---------------------- ---------------------------------- 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Default values for the above, for consistency and less typing. # Variable name Value #------------------------------ ------------------------------ 0.organizationName_default = The Sample Company localityName_default = Basel stateOrProvinceName_default = Basel-Stadt countryName_default = CH [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always
Um sicher zustellen das unser CA Zertifikat geschützt ist gegen unbefugte Nutzung, ist das Zertifikat Passwort geschützt. Jedesmal wen man ein Zertifikat mit dem CA Zertifikat von uns Signieren möchte, muss man ein Passwort eingeben.

Jetzt können wir unser selbstsigniertes Root Zertifikat erstellen.

Benutzte Kommandzeilen Optionen
  • Ein neues Selbst-signiertes Zertifikat erstellen: -new -x509
  • Ein CA Zertifikat erstellen: -extensions v3_ca
  • Gültigkeit: -days 3650
  • Ausgabe in spezifizierte Datei: -keyout, -out
  • Eigene Konfigurationsdatei benutzen: -config ./openssl.cnf
(Ein Hinweis in Bezug der gültigkeit des Root Zertifikates: Wen ein Root Zertifikat abgelaufen ist, sind alle Zertifikate, welche mit dem Root Zertifikat signiert sind, nicht mehr gültig! Deshalb ist unser Root Zertifikat 10 Jahre gültig.)

Führt folgenden Befehl aus. Ihr werdet nach einem neuen Passwort gefragt, welches ihr 2 mal angeben müsst. Merkt euch das Passwort! Den es wird benötigt, um eure Zertifikate zu signieren.

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

Ausgabe:
Using configuration from ./openssl.cnf
Generating a 1024 bit RSA private key .......++++++ ..........................++++++ writing new private key to 'private/cakey.pem' Enter PEM pass phrase:demo Verifying password - Enter PEM pass phrase:demo ----- 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. ----- Organization Name (company) [Meine Firma]: Organizational Unit Name (department, division) []:CA Division Email Address []:ca@sample.com Locality Name (city, district) [Basel]: State or Province Name (full name) [Basel-Stadt]: Country Name (2 letter code) [CH]: Common Name (hostname, IP, or your name) []:Mein Root CA
Dies erstellt 2 Dateien:
  • Ein Privater Schlüssel in "private/cakey.pem"
  • Ein Root CA Zertifikat in "cacert.pem"
cacert.pem ist die Datei welche man den Clients verteilt, damit sie das Root CA Zertifikat manuell importieren können. Weiter unten gibt es noch eine Methode, wie man das CA Zertifikat als Datei mit der Dateiendung ".crt", als Download Link anbieten kann. Dazu aber später mehr.

Private Key anzeigen:

cat /home/username/CA/private/cakey.pem
Der Privat Key (cakey.pem) sieht so aus:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,3A1E24518648628 jlQvt9WdR9Vpg3WQT5+C3HU17bUOwvhp/r0+viMcBUCRW85UqI2BJJKTi1IwQQ4c tyTrhYJYOP+A6JXt5BzDzZy/B7tjEMDBosPiwH2m4MaP+6wTbi1qR1pFDL3fXYDr QAPXhxpC7ftxMiKbdf2RTmgo/2JgU4AF1p45cIISJerf42g+GK36XA1paeVIgEUO qZb3mC6U2nRaP/NpZPcEx4lv2vH7OzHTu1TZ7t0asSpgpuH58dfHPw775kZDep2F LXA3Oeavg0TLFHkaFBU3fzreEG6Txpt9I74aAsw1T6UbTSjqgtsK0PHdjPNfPGlY 5U3Do1pnU9hfoem/4RAOe0cCovP/xf6YPBraSFPs4XFfnWwgEtL09ReFqO9T0aSp 5ajLyBOYOBKQ3PCSu1HQDw/OzphInhKxdYg81WBBEfELzSdMFQZgmfGrt5DyyWmq ITzTQcxXiAzkydqwnMKIAp1W2atwXDv7fZIthzQ+XkyVz0HlAM7M2uKS8Ug/FjUt 0FMHTEB5HQebEkKBoRQMCJN/uyKXTLjNB7ibtVbZmfjsi9oNd3NJNVQQH+o9I/rP wtFsjs+t7SKrsFB2cxZQdDlFzD6EBA+5ytebGEI1lJHcOUEa6P+LTphlwh/o1QuN IKX2YKHA4ePrBzdgZ+xZuSLn/Qtjg/eZv6i73VXoHk8EdxfOk5xkJ+DnsNmyx0vq zOITGqvZGFSZ0pbX58S9Hc9siHi+SD3943845jrMMpuxEe7YpXX2GsZzRgt2TQ63cS0 X1OZ9Dix+U0u6xXff0ETJ5dF3hV6GF7hP3Tmj9/UQdBwBzr+D8YWzQ== -----END RSA PRIVATE KEY-----
Naturlich wollen wir den cakey.pem niemandem zeigen. Dieser CA Key ist nun nicht mehr zu gebrauchen.

Das CA Zertifikat anzeigen:

cat /home/username/CA/private/cakey.pem
Das Zertifikat (cacert.pem) sieht so aus:
-----BEGIN CERTIFICATE-----
MIIDrTCCAxagAwIBAgIBADANBgkqhkiG9w0BAQQFADCBnDEbMBkGA1UEChMSVGhl IFNhbXBsZSBDb21wYW55MRQwEgYDVQQLEwtDQSBEaXZpc2lvbjEcMBoGCSqGSIb3 DQEJARYNY2FAc2FtcGxlLmNvbTETMBEGA1UEBxMKTWV0cm9wb2xpczERMA8GA1UE CBMITmV3IFlvcmsxCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtUU0MgUm9vdCBDQTAe Fw0wMTEyMDgwNDI3MDVaFw0wMjEyMDgwNDI3MDVaMIGcMRswGQYDVQQKExJUaGUg U2FtcGxlIENvbXBhbnkxFDASBgNVBAsTC0NBIERpdmlzaW9uMRwwGgYJKoZIhvcN AQkBFg1jYUBzYW1wbGUuY29tMRMwEQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQI EwhOZXcgWW9yazELMAkGA1UEBhMCVVMxFDASBgNVBAMTC1RTQyBSb290IENBMIGf MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaiAwfKB6ZBtnTRTIo6ddomt0S9ec0 NcuvtJogt0s9dXpHowh98FCDjnLtCi8du6LDTZluhlOtTFARPlV/LVnpsbyMCXMs G2qpdjJop+XIBdvoCz2HpGXjUmym8WLqt+coWwJqUSwiEba74JG93v7TU+Xcvc00 5MWnxmKZzD/R3QIDAQABo4H8MIH5MAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFG/v yytrBtEquMX2dreysix/MlPMMIHJBgNVHSMEgcEwgb6AFG/vyytrBtEquMX2drey six/MlPMoYGipIGfMIGcMRswGQYDVQQKExJUaGUgU2FtcGxlIENvbXBhbnkxFDAS BgNVBAsTC0NBIERpdmlzaW9uMRwwGgYJKoZIhvcNAQkBFg1jYUBzYW1wbGUuY29t MRMwEQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQIEwhOZXcgWW9yazELMAkGA1UE BhMCVVMxFDASBgNVBAMTC1RTQyBSb290IENBggEAMA0GCSqGSIb3DQEBBAUAA4GB ABclymJfsPOUazNQO8aIaxwVbXWS+8AFEkMMRx6O68ICAMubQBvs8Buz3ALXhqYe FS5G13pW2ZnAlSdTkSTKkE5wGZ1RYSfyiEKXb+uOKhDN9LnajDzaMPkNDU2NDXDz SqHk9ZiE1boQaMzjNLu+KabTLpmL9uXvFA/i+gdenFHv -----END CERTIFICATE-----
Um einzelne Ausschnitte aus dem Zertifkat anzusehen, kann man das mit folgenden Befehlen tun:

openssl x509 -in cacert.pem -noout -text
oder

openssl x509 -in cacert.pem -noout -dates
oder

openssl x509 -in cacert.pem -noout -purpose

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.