Debian OpenSSL: Unterschied zwischen den Versionen
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(34 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
=Allgemein= | ==Allgemein== | ||
OpenSSL schafft sämtliche Grundlagen, um sicher und verschlüsselt vertrauliche Informationen wie z.B. Username/Passwort und Emails via Internet zu übertragen. Für kommerzielle Anwendungen (z.B. Onlineshops und vor allem Onlinebanking) sind Zertifikate, erforderlich, die von einer vertrauenswürdigen CA (Certification Authority) signiert sind. Diese sog. Root_CA-Zertifiakte sind normalerweise in allen aktuellen Browsern und Mail-Clients bereits intergriert, sodass das Zertifikat einer Website automatisch verifiziert werden kann. Da ein derartiges signiertes Zertifikat für einen privat betriebenen Server viel zu kostspielig ist (ca 50€ ... 200€ pro Jahr), wird im folgenden ein sog. Selfsigned Zertifikat verwendet. zu diesem Zweck wird zunächst eine eigene CA eingerichtet, mit dessen Hilfe anschließend sämtliche zu erzeugenden Zertifikate signiert werden können. Nach dem (manuellen) Import des CA-Zertifikates in Browser/Mailtool, können diese analog zu kommerziell signierten Zertifikaten die Vertrauenswürdigkeit der Zertifikate ebenfalls überprüfen. | OpenSSL schafft sämtliche Grundlagen, um sicher und verschlüsselt vertrauliche Informationen wie z.B. Username/Passwort und Emails via Internet zu übertragen. Für kommerzielle Anwendungen (z.B. Onlineshops und vor allem Onlinebanking) sind Zertifikate, erforderlich, die von einer vertrauenswürdigen CA (Certification Authority) signiert sind. Diese sog. Root_CA-Zertifiakte sind normalerweise in allen aktuellen Browsern und Mail-Clients bereits intergriert, sodass das Zertifikat einer Website automatisch verifiziert werden kann. Da ein derartiges signiertes Zertifikat für einen privat betriebenen Server viel zu kostspielig ist (ca 50€ ... 200€ pro Jahr), wird im folgenden ein sog. Selfsigned Zertifikat verwendet. zu diesem Zweck wird zunächst eine eigene CA eingerichtet, mit dessen Hilfe anschließend sämtliche zu erzeugenden Zertifikate signiert werden können. Nach dem (manuellen) Import des CA-Zertifikates in Browser/Mailtool, können diese analog zu kommerziell signierten Zertifikaten die Vertrauenswürdigkeit der Zertifikate ebenfalls überprüfen. | ||
=Installation OpenSSL= | ==Installation OpenSSL== | ||
Falls OpenSSL noch nicht installiert sein sollte, dies nun nachholen: | Falls OpenSSL noch nicht installiert sein sollte, dies nun nachholen: | ||
apt-get install openssl | apt-get install openssl | ||
Zeile 10: | Zeile 10: | ||
mkdir /etc/ssl/CA | mkdir /etc/ssl/CA | ||
cd /etc/ssl/CA | cd /etc/ssl/CA | ||
mkdir newcerts private | mkdir certs key newcerts private req | ||
In diesen Verzeichnissen werden folgende Files abgelegt: | In diesen Verzeichnissen werden folgende Files abgelegt: | ||
* CA: | * CA: | ||
**CA-Zertifikat | **Root-CA-Zertifikat | ||
**Datenbank aller signieren zertifikate | **Datenbank aller signieren zertifikate | ||
**Schlüssel, Requests und signierte Zertifikate während der Erstellung | |||
* private: Privates Schlüsselfile der CA. Dieser Schlüssel ist enorm wichtig, und sollte an einer sicheren Stelle (Backup) archiviert werden, wo er sicher vor Datenverlust und unberechtigtem Zugriff ist. Ohne diesen Schlüssel können keine Zertifikate signiert werden. D.h. im Falle des Verlustes muss die CA und sämtliche Zertifikate neu erstellt werden. | * private: Privates Schlüsselfile der CA. Dieser Schlüssel ist enorm wichtig, und sollte an einer sicheren Stelle (Backup) archiviert werden, wo er sicher vor Datenverlust und unberechtigtem Zugriff ist. Ohne diesen Schlüssel können keine Zertifikate signiert werden. D.h. im Falle des Verlustes muss die CA und sämtliche Zertifikate neu erstellt werden. | ||
*newcerts: Enthält eine Kopie sämtlicher signierter Zertifikate | * key: Keyfiles aller erstellten Zertifikate | ||
* req: Zertifikat Request Files (noch nicht signiert) | |||
* certs: Enthält sämtliche signierte Zertifikate | |||
* newcerts: Enthält eine Kopie sämtlicher signierter Zertifikate | |||
Initialisieren der Datenbank: | Initialisieren der Datenbank: | ||
Zeile 25: | Zeile 29: | ||
=OpenSSL Konfigurationsdatei= | ==OpenSSL Konfigurationsdatei== | ||
Die Datei openssl.conf enthält Einträge, die im Folgenden eine Menge Tipparbeit einsparen wird | Die Datei openssl.conf enthält Einträge, die im Folgenden eine Menge Tipparbeit einsparen wird. Debian installiert bereits eine openssl.cnf im Ordner /etc/ssl. Diese wird im folgenden als Ausgangspunkt verwendet. | ||
cp /etc/ssl/openssl.cnf /etc/ssl/openssl.conf | |||
Anpassen des Files: | |||
vi /etc/ssl/openssl.conf | |||
Folgende Änderungen durchführen: | |||
HOME = /etc/ssl/CA | |||
Im Bereich [ CA_default ] folgende Änderungen durchführen: | |||
dir = /etc/ssl/CA | |||
copy_extensions = copy (Kommentarzeichen [#] entfernen) | |||
default_days = 365 (bei Bedarf erhöhen, damit generierte Zertifikate länger gelten) | |||
Im Bereich [ policy_match ] folgende Änderung durchführen: | |||
organizationName = optional | |||
Im Bereich [ req ] folgende Änderung durchführen: | |||
default_keyfile = key.pem | |||
req_extensions = v3_req (das Kommentarzeichen [#] entfernen) | |||
Im Bereich [ req_distinguished_name ] folgende Änderungen druchführen: | |||
countryName_default = DE | |||
stateOrProvinceName_default = Bavaria | |||
0.organizationName_default = Private | 0.organizationName_default = Private | ||
organizationalUnitName_default = Server Administration | |||
=Wichtige Anmerkungen= | ==Wichtige Anmerkungen== | ||
Für die SSL-Zertifikate sind einige Parameter wichtig. Diese sind: | Für die SSL-Zertifikate sind einige Parameter wichtig. Diese sind: | ||
Zeile 119: | Zeile 71: | ||
=CA erstellen= | ==CA erstellen== | ||
Die Certification Authority wird mit folgendem Befehl erzeugt (Gültigkeit der CA: 10Jahre - 3650 days): | Die Certification Authority wird mit folgendem Befehl erzeugt (Gültigkeit der CA: 10Jahre - 3650 days): | ||
openssl req -new -x509 -extensions v3_ca -keyout | openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.conf | ||
Dieser Befehl erzeugt: | Dieser Befehl erzeugt: | ||
* '''''/etc/ssl/CA/cacert.pem:''''' Root-Zertifikat der CA | * '''''/etc/ssl/CA/cacert.pem:''''' Root-Zertifikat der CA | ||
Zeile 128: | Zeile 80: | ||
Es sind folgende Eingaben erforderlich (siehe auch [[Debian_OpenSSL#Wichtige Anmerkungen|→ hier]]): | Es sind folgende Eingaben erforderlich (siehe auch [[Debian_OpenSSL#Wichtige Anmerkungen|→ hier]]): | ||
* Passphrase (2x). Schützt den CA-key (private/cakey.pem) vor unberechtigter Nutzung. Dieses Passwort ist später erforderlich, um Zertifikate zu signieren. | * Passphrase (2x). Schützt den CA-key (private/cakey.pem) vor unberechtigter Nutzung. Dieses Passwort ist später erforderlich, um Zertifikate zu signieren. | ||
* O: z.B. | * O: z.B. domain_Root_CA | ||
* OU: z.B. CA Administration | * OU: z.B. CA Administration | ||
* Email Adress: z.B. leer | * Email Adress: z.B. leer | ||
Zeile 136: | Zeile 88: | ||
* CN: z.B. domain_Root_CA | * CN: z.B. domain_Root_CA | ||
Zum Importieren in den Clients (Webbrowser, Mailprogramm), solte das Root-CA-Zertifikat unter einem anderen Namen (und | Zugriffsrechte setzen: | ||
chmod 600 private/cakey.pem | |||
Fingerprint (SHA-1 Algorithmus) des Root-CA Zertifikates ermitteln: | |||
openssl x509 -in /etc/ssl/CA/cacert.pem -noout -fingerprint | |||
Dieser Fingerprint identifiziert das Root-CA Zertifikat eindeutig. | |||
Zum Importieren in den Clients (Webbrowser, Mailprogramm), solte das Root-CA-Zertifikat unter einem anderen Namen (und Dateiendung) abgespeichert werden: | |||
cp cacert.pem MeinRootCA.crt | cp cacert.pem MeinRootCA.crt | ||
=Server-Zertifikat erstellen= | ==Server-Zertifikat erstellen== | ||
Im folgenden wird ein Serverzertifikat erstellt, das für einen Web- oder Mailserverver verwendet werden kann. | Im folgenden wird ein Serverzertifikat erstellt, das für einen Web- oder Mailserverver verwendet werden kann. | ||
==Certificate Signing Request== | ===Certificate Signing Request=== | ||
Der CSR enthält alle wesentlichen Angaben zum Zertifikat, das dann im zweiten Schritt mit eben angelegter CA signiert wird. | Der CSR enthält alle wesentlichen Angaben zum Zertifikat, das dann im zweiten Schritt mit eben angelegter CA signiert wird. | ||
openssl req -new -nodes -out req.pem -config ./openssl. | openssl req -new -nodes -out req.pem -config ./openssl.conf | ||
Dieser Befehl erzeugt: | Dieser Befehl erzeugt: | ||
* '''''/etc/ssl/CA/req.pem:''''' Zertifikats Request | * '''''/etc/ssl/CA/req.pem:''''' Zertifikats Request | ||
Zeile 158: | Zeile 118: | ||
* ST: z.B. Bavaria | * ST: z.B. Bavaria | ||
* C: z.B. DE | * C: z.B. DE | ||
* CN: z.B. domain.org | * CN: z.B. domain.org | ||
Inhalt des Zertifikates überprüfen: | |||
openssl req -in req.pem -text -verify -noout | |||
==Zertifikat signieren== | ===Zertifikat signieren=== | ||
Damit das Zertifikat gültig wird, muss es von einer CA signiert werden. Der eben erzeugte Zertifikate Request kann von einer kommerziellen CA, oder von unserer eigenen CA signiert werden. Hier wird das Zertifikat von der oben angelegten CA signiert. | Damit das Zertifikat gültig wird, muss es von einer CA signiert werden. Der eben erzeugte Zertifikate Request kann von einer kommerziellen CA, oder von unserer eigenen CA signiert werden. Hier wird das Zertifikat von der oben angelegten CA signiert. | ||
openssl ca -out cert.pem -config ./openssl. | openssl ca -out cert.pem -config ./openssl.conf -infiles req.pem | ||
Zum Signieren sind noch folgende Angaben erforderlich: | Zum Signieren sind noch folgende Angaben erforderlich: | ||
* Passwort des CA-Keys (siehe [[Debian_OpenSSL#CA erstellen|→ hier]]) | * Passwort des CA-Keys (siehe [[Debian_OpenSSL#CA erstellen|→ hier]]) | ||
Zeile 169: | Zeile 132: | ||
* 1 out of 1 certificate requests certified, commit? [y/n]: y | * 1 out of 1 certificate requests certified, commit? [y/n]: y | ||
Dadurch wird schließlich das gültige Zertifikat /etc/ssl/CA/cert.pem und zusätzlich eine Kopie in /etc/ssl/CA/newcerts/xy.pem (xy: Serialnummer des erzeugten Zertifikats) | Dadurch wird schließlich das gültige Zertifikat /etc/ssl/CA/cert.pem und zusätzlich eine Kopie in /etc/ssl/CA/newcerts/xy.pem (xy: Serialnummer des erzeugten Zertifikats) erstellt. | ||
Der Inhalt des signierten Zertifikates kann folgendermaßen überprüft werden: | |||
openssl x509 -in cert.pem -noout -text -purpose | |||
===Zertifikat und Key verwalten=== | |||
Dem Key und dem signierten Zertifikat sollten aussagekräftige Namen (z.B. apache-cert.pem, apache-key.pem, wildcard-cert.pem, wildard-key.pem usw), damit diese später einwandfrei identifizierbar sind. | |||
mv req.pem req/server-req.pem | |||
mv key.pem key/server-key.pem | |||
mv cert.pem certs/server-cert.pem | |||
Zusätzlich besteht die Möglichkeit, Key und Zertifikat in einem gemeinsamen File "zu verheiraten". Je nach Anwendung (z.B. Apache oder Mailserver) kann es vorteilhaft/erforderlich sein, Key und Zertifikat in zwei getrennten Files (Cyrus, Apache) oder in einem gemeinsamen File (Apache) zur Verfügng zu stellen. Mit folgendem Befehl wird Key und Zertifikat im File /etc/ssl/CA/key-cert.pem generiert: | Zusätzlich besteht die Möglichkeit, Key und Zertifikat in einem gemeinsamen File "zu verheiraten". Je nach Anwendung (z.B. Apache oder Mailserver) kann es vorteilhaft/erforderlich sein, Key und Zertifikat in zwei getrennten Files (Cyrus, Apache) oder in einem gemeinsamen File (Apache) zur Verfügng zu stellen. Mit folgendem Befehl wird Key und Zertifikat im File /etc/ssl/CA/key-cert.pem generiert: | ||
cat key.pem cert.pem > | cat key/server-key.pem certs/server-cert.pem >certs/server.pem | ||
==Optional: Wildcard Zertifikat== | |||
Ein sog. Wildcardzertifikat wird in identischer Form zum eben erstellten Serverzertifikat angelegt. Der einzige Unterschied besteht darin, dass CN=*.domain.org anstatt CN=domain.org gesetzt wird. Dadurch ist das Zertifikat für alle Subdomains (z.B. Virtuelle Hosts bei Apache) von domain.org gültig. Dieses Zertifikat ist allerdings nicht gültig für https://domain.org. | |||
Vorgehen analog [[Debian_OpenSSL#Server-Zertifikat erstellen|Serverzertifikat]]: | |||
openssl req -new -nodes -out req.pem -config ./openssl.conf | |||
openssl ca -out cert.pem -config ./openssl.conf -infiles req.pem | |||
mv req.pem req/wildcard-req.pem | |||
mv key.pem key/wildcard-key.pem | |||
mv cert.pem certs/wildcard-cert.pem | |||
cat key/wildcard-key.pem certs/wildcard-cert.pem >certs/wildcard.pem | |||
=Zertifikat im Client importieren= | |||
==Root-CA Zertifikat verteilen== | ==Optional: Zertifikat für mehrere Domains== | ||
Damit die Clients das selbstsignierte Zertifikat identifizieren | Das Wildcard-Zertifikat gilt für sämtliche Subdomains einer Domain. Es besteht aber auch die Möglichkeit, ein Zertifikat für mehrere Domains (und IP-Adressen) gültig zu machen. Dafür werden sog. '''subjectAltNames''' verwendet. Dies erfordert eine Modifikation der openssl.conf | ||
vi /etc/ssl/CA/openssl.conf | |||
Am Ende des [ v3_req ] Bereich's folgende Zeilen ergänzen: | |||
subjectAltName = @alt_names | |||
[alt_names] | |||
DNS.1 = test.homelinux.org | |||
DNS.2 = www.test.homelinux.org | |||
DNS.3 = wiki.test.homelinux.org | |||
DNS.4 = *.test.dyndns.org | |||
IP.1 = 192.168.178.227 | |||
IP.2 = 192.168.178.228 | |||
Hier können beliebig viele '''DNS.x''' (Domainnamen) und '''IP.y''' (IP-Adressen) Einträge eingefügt werden. Wie im obigen Beispiel (*.test.dyndns.org) ist es hier auch möglich, Wildcards zu verwenden. | |||
Der Rest der Generierung erfolgt exakt wie für ein Serverzertifikat bzw. Wildcardzertifikat. | |||
{{Hinweis|Nach der Signierung des Zertifikates sollte die Zeile '''subjectAltName''' wieder kommentiert werden (Kommentarzeichen # davor einfügen). Der Bereich [ alt_names] kann veerbleiben, da er ohne den subjectAltNames- Eintrag nicht mit berücksichtigt wird.}} | |||
==Zertifikat im Client importieren== | |||
===Root-CA Zertifikat verteilen=== | |||
Damit die Clients das selbstsignierte Zertifikat identifizieren und als vertrauenswürdig einstufen können, muss das Root-CA-Zertifikat (MeinRootCa.crt) in den Client Programmen importiert werden. Um ein "falsches" oder gefälschtes Root-CA-Zertifikat vor dem Import erkennen zu können, sollte immer der korrekte Fingerprint bekannt sein. Ist dies nicht der Fall, ist Vorsicht gebotoen. | |||
Der Import des Root-CA-Zertifkates kann auf vielfältige Art und Weise geschehen: | |||
* via FTP-Server | * via FTP-Server | ||
* per Mailversand | * per Mailversand | ||
* WinSCP | * WinSCP | ||
* Eine besonders elegante Möglichkeit das Root-CA-Zertifikat den Clients zur Verfügung zu stellen, besteht darin, dieses als Download auf einem Webserver zur Verfügung zu stellen: | |||
cp /etc/ssl/CA/MeinRootCA.crt /var/www/ | |||
vi /var/www/rootca.html | |||
Folgende Zeilen eingeben ('''''domain.org''''' mit realer Domain ersetzen, '''''FINGERPRINT''''' mit dem [[Debian_OpenSSL#CA erstellen|ermittelten SHA-1 Fingerprint]] ersetzen) | |||
<html> | |||
<body> | |||
<nowiki><h1>Download des Root CA-Zertifikates für Domain </nowiki>'''''domain.org'''''<nowiki></h1></nowiki> | |||
<nowiki>Folgenden Link bitte mit der rechten Maustaste anklicken und "Ziel speichern unter..." auswaehlen, | |||
um das Root-CA Zertifikat auf den lokalen PC zu uebertragen.: <a href="http://</nowiki>'''''domain.org'''''<nowiki>/MeinRootCA.crt">MeinRootCA.crt</a></nowiki> | |||
<br><br><hr> | |||
SHA-1 Fingerprint des Root-CA-Zertifikates: '''FINGERPRINT''' | |||
</body> | |||
</html> | |||
* Webseite im Webbrowser öffnen: http://domain.org/rootca.html | |||
* Den Link auf MeinRootCA.crt mit der rechten Maustaste anklicken und '''Ziel speichern unter...''' auswählen | |||
* Root-CA Zertifikat lokal auf dem PC abspeichern | |||
==Mozilla Firefox und Thunderbird== | ===Mozilla Firefox und Thunderbird=== | ||
{{Hinweis|Firefox sollte nicht im privaten Modus sein, da er ansonsten das Root-CA-Zertifikat nur für die eine Sitzung speichert und es nach einem Neustart nicht mehr kennt.}} | |||
* Einstellungsdialog öffnen | * Einstellungsdialog öffnen | ||
* Tab '''Erweitert''' | * Tab '''Erweitert''' | ||
* Tab '''Verschlüsselung''' | |||
* Button '''Zertifikate anzeigen''' | * Button '''Zertifikate anzeigen''' | ||
* Tab '''Zertifizierungsstellen''' | * Tab '''Zertifizierungsstellen''' | ||
Zeile 195: | Zeile 217: | ||
* Button '''Importieren''' auswählen | * Button '''Importieren''' auswählen | ||
* Das auf den Client übertragene Root-CA-Zertifikat (MeinRootCA.crt) auswählen und bestätigen. | * Das auf den Client übertragene Root-CA-Zertifikat (MeinRootCA.crt) auswählen und bestätigen. | ||
* Button '''Ansicht anklicken''' | |||
* Die Daten des Root-CA-Zertifikates überprüfen und insbesondere den SHA-1 Fingerprint verifizieren und Dialog wieder schließen | |||
* Wenn die Daten des Zertifikates in Ordnung sind: | |||
** '''Dieser CA vertrauen, um Websites zu identifizieren''' anwählen | |||
** '''Dieser CA vertrauen, um E-Mail-Nutzer zu identifizieren''' anwählen | |||
** mit Button '''OK''' bestätigen. | |||
* Ansonsten den Import abbrechen | |||
{{Hinweis| Falls im Tab '''Server''' bereits Server-Zertifikate mit der Domain (CN) des selbstsignierten Zertifikates vorhanden sind, sollten diese nun gelöscht werden. Das selbstsignierte Zertifikat wird durch den Import des Root-CA Zertifikats als vertrauenswürdig erkannt.}} | |||
===Internet Explorer und Outlook=== | |||
Internet und Outlook verwenden den Zertifikatespeicher von Windows. Das Root bzw. Stammzertifikat kann auf zweierlei Arten importiert werden: | |||
====Internet Explorer==== | |||
* Menü '''Extras/Internetoptionen''' | |||
* Reiter '''Inhalte''' | |||
* Button '''Herausgeber''' | |||
* Reiter '''Vertrauenswürdige Stammzertifizierungsstellen''' | |||
* Button '''Importieren''' auswählen | |||
* Dem Assistenten folgen und das Root-CA-Zertifikat (MeinRootCA.crt) auswählen. Die folgenden Abfragen bestätigen. | |||
* Am Ende (nachdem der Button '''fertigstellen''' betätigt wurde) wird ein Dialog angezeigt, der sämtliche Details des Root-CA-Zertifikates anzeigt. Die Daten überprüfen und insbesondere den SHA-1 Fingerprint verifizieren. | |||
* Wenn das Zertifikat in Ordnung ist, Button '''Ja''' auswählen, ansonsten '''nein''' | |||
====Windows Explorer==== | |||
* Das Root-Zertifikat im Windows Explorer doppelklicken | |||
* Button '''Zertifikat installieren ...''' auswählen | |||
* Im erscheinenden Zertifikatimport-Assistent den Button '''Weiter''' anklicken | |||
* Den Optionsbutton '''Alle Zertifikate in folgendem Speicher speichern''' anwählen und anschließend auf '''Durchsuchen''' klicken | |||
* Im erscheinenden Fenster '''Vertrauenswürdige Stammzertifizierungsstellen''' auswählen und mit Button '''OK''' bestätigen | |||
* Nach Rückkehr zum Zertifikatimport-Assistent den Button '''Weiter''' anklicken | |||
* Mit '''Fertigstellen''' den Assistenten beenden | |||
==Zertifikat wiederrufen== | |||
Um ein neues Zertifikat mit dem gleichen "CommonName" zu erstellen, muß das alte Zertifikat erst wiederrufen werden. Dieses ist im "newcerts" Ordner abgelegt. Der Dateiname entspricht der Nummer aus der "Index.txt" Datei plus die Dateiendung .pem . | |||
Das Zertifikat wird mittels folgendem Befehl wiederrufen: | |||
openssl ca -revoke newcerts/'''03'''.pem -config ./openssl.cnf | |||
Als Ausgabe sollte erscheinen: | |||
debian:/etc/ssl/CA# openssl ca -revoke newcerts/03.pem -config ./openssl.conf | |||
Using configuration from ./openssl.conf | |||
Enter pass phrase for ./private/cakey.pem: | |||
Revoking Certificate 03. | |||
Data Base Updated | |||
debian:/etc/ssl/CA# | |||
Nun ist das alte Zertifikat zurückgezogen und man kann mit dem Neusignieren des Original Requests beginnen. | |||
{{Hinweis|Der Status des Zertifikats sollte von V (valid) auf R (revoked) wechseln. | |||
* Gütliges Zertifikat: | |||
...... | |||
<nowiki>V 201079104254Z 03 unknown /C=DE/ST=Bavaria/O=Mail_CA/OU=Mail_CA/CN=domain.org</nowiki> | |||
* Zurückgezogenes Zertifikat | |||
..... | |||
<nowiki>R 201079104254Z 03 unknown /C=DE/ST=Bavaria/O=Mail_CA/OU=Mail_CA/CN=domain.org</nowiki> | |||
}} |
Aktuelle Version vom 14. Oktober 2012, 08:49 Uhr
Allgemein
OpenSSL schafft sämtliche Grundlagen, um sicher und verschlüsselt vertrauliche Informationen wie z.B. Username/Passwort und Emails via Internet zu übertragen. Für kommerzielle Anwendungen (z.B. Onlineshops und vor allem Onlinebanking) sind Zertifikate, erforderlich, die von einer vertrauenswürdigen CA (Certification Authority) signiert sind. Diese sog. Root_CA-Zertifiakte sind normalerweise in allen aktuellen Browsern und Mail-Clients bereits intergriert, sodass das Zertifikat einer Website automatisch verifiziert werden kann. Da ein derartiges signiertes Zertifikat für einen privat betriebenen Server viel zu kostspielig ist (ca 50€ ... 200€ pro Jahr), wird im folgenden ein sog. Selfsigned Zertifikat verwendet. zu diesem Zweck wird zunächst eine eigene CA eingerichtet, mit dessen Hilfe anschließend sämtliche zu erzeugenden Zertifikate signiert werden können. Nach dem (manuellen) Import des CA-Zertifikates in Browser/Mailtool, können diese analog zu kommerziell signierten Zertifikaten die Vertrauenswürdigkeit der Zertifikate ebenfalls überprüfen.
Installation OpenSSL
Falls OpenSSL noch nicht installiert sein sollte, dies nun nachholen:
apt-get install openssl
Verzeichnisse für die eigene CA und die selfsigned Zertifikate anlegen:
mkdir /etc/ssl/CA cd /etc/ssl/CA mkdir certs key newcerts private req
In diesen Verzeichnissen werden folgende Files abgelegt:
- CA:
- Root-CA-Zertifikat
- Datenbank aller signieren zertifikate
- Schlüssel, Requests und signierte Zertifikate während der Erstellung
- private: Privates Schlüsselfile der CA. Dieser Schlüssel ist enorm wichtig, und sollte an einer sicheren Stelle (Backup) archiviert werden, wo er sicher vor Datenverlust und unberechtigtem Zugriff ist. Ohne diesen Schlüssel können keine Zertifikate signiert werden. D.h. im Falle des Verlustes muss die CA und sämtliche Zertifikate neu erstellt werden.
- key: Keyfiles aller erstellten Zertifikate
- req: Zertifikat Request Files (noch nicht signiert)
- certs: Enthält sämtliche signierte Zertifikate
- newcerts: Enthält eine Kopie sämtlicher signierter Zertifikate
Initialisieren der Datenbank:
echo '01' >serial touch index.txt
OpenSSL Konfigurationsdatei
Die Datei openssl.conf enthält Einträge, die im Folgenden eine Menge Tipparbeit einsparen wird. Debian installiert bereits eine openssl.cnf im Ordner /etc/ssl. Diese wird im folgenden als Ausgangspunkt verwendet.
cp /etc/ssl/openssl.cnf /etc/ssl/openssl.conf
Anpassen des Files:
vi /etc/ssl/openssl.conf
Folgende Änderungen durchführen:
HOME = /etc/ssl/CA
Im Bereich [ CA_default ] folgende Änderungen durchführen:
dir = /etc/ssl/CA copy_extensions = copy (Kommentarzeichen [#] entfernen) default_days = 365 (bei Bedarf erhöhen, damit generierte Zertifikate länger gelten)
Im Bereich [ policy_match ] folgende Änderung durchführen:
organizationName = optional
Im Bereich [ req ] folgende Änderung durchführen:
default_keyfile = key.pem req_extensions = v3_req (das Kommentarzeichen [#] entfernen)
Im Bereich [ req_distinguished_name ] folgende Änderungen druchführen:
countryName_default = DE stateOrProvinceName_default = Bavaria 0.organizationName_default = Private organizationalUnitName_default = Server Administration
Wichtige Anmerkungen
Für die SSL-Zertifikate sind einige Parameter wichtig. Diese sind:
* C (country:2 Zeichen) * ST (State/Provinz) * L (Locality/Ort) * O (Organisation) * OU (Organisational Unit) * Email Adress * CN (Common Name)
- Country(C) und State (ST) müssen bei CA und erstellten Zertifikaten identisch sein.
- Ort ist optional
- Email Adress ist optional
- Organisation, Organisational Unit und Common Name sollten bei CA und erstellten Zertifikaten unterschiedlich sein. Ansonsten kann es einerseits bei der Signierung der Zertifikate selbst, oder auch später bei den Clients zu Problemen kommen.
- Common Name eines Zertifikates (Nicht CA) muss unbedingt exakt mit dem Servernamen des zu sichernden Servers übereinstimmen. Ansonsten werden die Clients den Unterschied zwischen Zertifkat Common Name und Servernamen "anmeckern".
CA erstellen
Die Certification Authority wird mit folgendem Befehl erzeugt (Gültigkeit der CA: 10Jahre - 3650 days):
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.conf
Dieser Befehl erzeugt:
- /etc/ssl/CA/cacert.pem: Root-Zertifikat der CA
- /etc/ssl/CA/private/cakey.pem:
Es sind folgende Eingaben erforderlich (siehe auch → hier):
- Passphrase (2x). Schützt den CA-key (private/cakey.pem) vor unberechtigter Nutzung. Dieses Passwort ist später erforderlich, um Zertifikate zu signieren.
- O: z.B. domain_Root_CA
- OU: z.B. CA Administration
- Email Adress: z.B. leer
- L: z.B. Other
- ST: z.B. Bavaria
- C: z.B. DE
- CN: z.B. domain_Root_CA
Zugriffsrechte setzen:
chmod 600 private/cakey.pem
Fingerprint (SHA-1 Algorithmus) des Root-CA Zertifikates ermitteln:
openssl x509 -in /etc/ssl/CA/cacert.pem -noout -fingerprint
Dieser Fingerprint identifiziert das Root-CA Zertifikat eindeutig.
Zum Importieren in den Clients (Webbrowser, Mailprogramm), solte das Root-CA-Zertifikat unter einem anderen Namen (und Dateiendung) abgespeichert werden:
cp cacert.pem MeinRootCA.crt
Server-Zertifikat erstellen
Im folgenden wird ein Serverzertifikat erstellt, das für einen Web- oder Mailserverver verwendet werden kann.
Certificate Signing Request
Der CSR enthält alle wesentlichen Angaben zum Zertifikat, das dann im zweiten Schritt mit eben angelegter CA signiert wird.
openssl req -new -nodes -out req.pem -config ./openssl.conf
Dieser Befehl erzeugt:
- /etc/ssl/CA/req.pem: Zertifikats Request
- /etc/ssl/CA/key.pem: privater Schlüssel für das Zertifikat
Es sind folgende Eingaben erforderlich (siehe auch → hier):
- Passphrase (2x). Schützt den Schlüssel (key.pem) vor unberechtigter Nutzung.
- O: z.B. Private
- OU: z.B. Server Administration
- Email Adress: z.B. leer
- L: z.B. Other
- ST: z.B. Bavaria
- C: z.B. DE
- CN: z.B. domain.org
Inhalt des Zertifikates überprüfen:
openssl req -in req.pem -text -verify -noout
Zertifikat signieren
Damit das Zertifikat gültig wird, muss es von einer CA signiert werden. Der eben erzeugte Zertifikate Request kann von einer kommerziellen CA, oder von unserer eigenen CA signiert werden. Hier wird das Zertifikat von der oben angelegten CA signiert.
openssl ca -out cert.pem -config ./openssl.conf -infiles req.pem
Zum Signieren sind noch folgende Angaben erforderlich:
- Passwort des CA-Keys (siehe → hier)
- Sign the certificate? [y/n]: y
- 1 out of 1 certificate requests certified, commit? [y/n]: y
Dadurch wird schließlich das gültige Zertifikat /etc/ssl/CA/cert.pem und zusätzlich eine Kopie in /etc/ssl/CA/newcerts/xy.pem (xy: Serialnummer des erzeugten Zertifikats) erstellt.
Der Inhalt des signierten Zertifikates kann folgendermaßen überprüft werden:
openssl x509 -in cert.pem -noout -text -purpose
Zertifikat und Key verwalten
Dem Key und dem signierten Zertifikat sollten aussagekräftige Namen (z.B. apache-cert.pem, apache-key.pem, wildcard-cert.pem, wildard-key.pem usw), damit diese später einwandfrei identifizierbar sind.
mv req.pem req/server-req.pem mv key.pem key/server-key.pem mv cert.pem certs/server-cert.pem
Zusätzlich besteht die Möglichkeit, Key und Zertifikat in einem gemeinsamen File "zu verheiraten". Je nach Anwendung (z.B. Apache oder Mailserver) kann es vorteilhaft/erforderlich sein, Key und Zertifikat in zwei getrennten Files (Cyrus, Apache) oder in einem gemeinsamen File (Apache) zur Verfügng zu stellen. Mit folgendem Befehl wird Key und Zertifikat im File /etc/ssl/CA/key-cert.pem generiert:
cat key/server-key.pem certs/server-cert.pem >certs/server.pem
Optional: Wildcard Zertifikat
Ein sog. Wildcardzertifikat wird in identischer Form zum eben erstellten Serverzertifikat angelegt. Der einzige Unterschied besteht darin, dass CN=*.domain.org anstatt CN=domain.org gesetzt wird. Dadurch ist das Zertifikat für alle Subdomains (z.B. Virtuelle Hosts bei Apache) von domain.org gültig. Dieses Zertifikat ist allerdings nicht gültig für https://domain.org.
Vorgehen analog Serverzertifikat:
openssl req -new -nodes -out req.pem -config ./openssl.conf openssl ca -out cert.pem -config ./openssl.conf -infiles req.pem mv req.pem req/wildcard-req.pem mv key.pem key/wildcard-key.pem mv cert.pem certs/wildcard-cert.pem cat key/wildcard-key.pem certs/wildcard-cert.pem >certs/wildcard.pem
Optional: Zertifikat für mehrere Domains
Das Wildcard-Zertifikat gilt für sämtliche Subdomains einer Domain. Es besteht aber auch die Möglichkeit, ein Zertifikat für mehrere Domains (und IP-Adressen) gültig zu machen. Dafür werden sog. subjectAltNames verwendet. Dies erfordert eine Modifikation der openssl.conf
vi /etc/ssl/CA/openssl.conf
Am Ende des [ v3_req ] Bereich's folgende Zeilen ergänzen:
subjectAltName = @alt_names [alt_names] DNS.1 = test.homelinux.org DNS.2 = www.test.homelinux.org DNS.3 = wiki.test.homelinux.org DNS.4 = *.test.dyndns.org IP.1 = 192.168.178.227 IP.2 = 192.168.178.228
Hier können beliebig viele DNS.x (Domainnamen) und IP.y (IP-Adressen) Einträge eingefügt werden. Wie im obigen Beispiel (*.test.dyndns.org) ist es hier auch möglich, Wildcards zu verwenden.
Der Rest der Generierung erfolgt exakt wie für ein Serverzertifikat bzw. Wildcardzertifikat.
Zertifikat im Client importieren
Root-CA Zertifikat verteilen
Damit die Clients das selbstsignierte Zertifikat identifizieren und als vertrauenswürdig einstufen können, muss das Root-CA-Zertifikat (MeinRootCa.crt) in den Client Programmen importiert werden. Um ein "falsches" oder gefälschtes Root-CA-Zertifikat vor dem Import erkennen zu können, sollte immer der korrekte Fingerprint bekannt sein. Ist dies nicht der Fall, ist Vorsicht gebotoen.
Der Import des Root-CA-Zertifkates kann auf vielfältige Art und Weise geschehen:
- via FTP-Server
- per Mailversand
- WinSCP
- Eine besonders elegante Möglichkeit das Root-CA-Zertifikat den Clients zur Verfügung zu stellen, besteht darin, dieses als Download auf einem Webserver zur Verfügung zu stellen:
cp /etc/ssl/CA/MeinRootCA.crt /var/www/ vi /var/www/rootca.html
Folgende Zeilen eingeben (domain.org mit realer Domain ersetzen, FINGERPRINT mit dem ermittelten SHA-1 Fingerprint ersetzen)
<html> <body> <h1>Download des Root CA-Zertifikates für Domain domain.org</h1> Folgenden Link bitte mit der rechten Maustaste anklicken und "Ziel speichern unter..." auswaehlen, um das Root-CA Zertifikat auf den lokalen PC zu uebertragen.: <a href="http://domain.org/MeinRootCA.crt">MeinRootCA.crt</a>
SHA-1 Fingerprint des Root-CA-Zertifikates: FINGERPRINT </body> </html>
- Webseite im Webbrowser öffnen: http://domain.org/rootca.html
- Den Link auf MeinRootCA.crt mit der rechten Maustaste anklicken und Ziel speichern unter... auswählen
- Root-CA Zertifikat lokal auf dem PC abspeichern
Mozilla Firefox und Thunderbird
Hinweis: | |
Firefox sollte nicht im privaten Modus sein, da er ansonsten das Root-CA-Zertifikat nur für die eine Sitzung speichert und es nach einem Neustart nicht mehr kennt. |
- Einstellungsdialog öffnen
- Tab Erweitert
- Tab Verschlüsselung
- Button Zertifikate anzeigen
- Tab Zertifizierungsstellen
- Button Importieren auswählen
- Das auf den Client übertragene Root-CA-Zertifikat (MeinRootCA.crt) auswählen und bestätigen.
- Button Ansicht anklicken
- Die Daten des Root-CA-Zertifikates überprüfen und insbesondere den SHA-1 Fingerprint verifizieren und Dialog wieder schließen
- Wenn die Daten des Zertifikates in Ordnung sind:
- Dieser CA vertrauen, um Websites zu identifizieren anwählen
- Dieser CA vertrauen, um E-Mail-Nutzer zu identifizieren anwählen
- mit Button OK bestätigen.
- Ansonsten den Import abbrechen
Internet Explorer und Outlook
Internet und Outlook verwenden den Zertifikatespeicher von Windows. Das Root bzw. Stammzertifikat kann auf zweierlei Arten importiert werden:
Internet Explorer
- Menü Extras/Internetoptionen
- Reiter Inhalte
- Button Herausgeber
- Reiter Vertrauenswürdige Stammzertifizierungsstellen
- Button Importieren auswählen
- Dem Assistenten folgen und das Root-CA-Zertifikat (MeinRootCA.crt) auswählen. Die folgenden Abfragen bestätigen.
- Am Ende (nachdem der Button fertigstellen betätigt wurde) wird ein Dialog angezeigt, der sämtliche Details des Root-CA-Zertifikates anzeigt. Die Daten überprüfen und insbesondere den SHA-1 Fingerprint verifizieren.
- Wenn das Zertifikat in Ordnung ist, Button Ja auswählen, ansonsten nein
Windows Explorer
- Das Root-Zertifikat im Windows Explorer doppelklicken
- Button Zertifikat installieren ... auswählen
- Im erscheinenden Zertifikatimport-Assistent den Button Weiter anklicken
- Den Optionsbutton Alle Zertifikate in folgendem Speicher speichern anwählen und anschließend auf Durchsuchen klicken
- Im erscheinenden Fenster Vertrauenswürdige Stammzertifizierungsstellen auswählen und mit Button OK bestätigen
- Nach Rückkehr zum Zertifikatimport-Assistent den Button Weiter anklicken
- Mit Fertigstellen den Assistenten beenden
Zertifikat wiederrufen
Um ein neues Zertifikat mit dem gleichen "CommonName" zu erstellen, muß das alte Zertifikat erst wiederrufen werden. Dieses ist im "newcerts" Ordner abgelegt. Der Dateiname entspricht der Nummer aus der "Index.txt" Datei plus die Dateiendung .pem .
Das Zertifikat wird mittels folgendem Befehl wiederrufen:
openssl ca -revoke newcerts/03.pem -config ./openssl.cnf
Als Ausgabe sollte erscheinen:
debian:/etc/ssl/CA# openssl ca -revoke newcerts/03.pem -config ./openssl.conf Using configuration from ./openssl.conf Enter pass phrase for ./private/cakey.pem: Revoking Certificate 03. Data Base Updated debian:/etc/ssl/CA#
Nun ist das alte Zertifikat zurückgezogen und man kann mit dem Neusignieren des Original Requests beginnen.