Howto selbstsigniertes SSL Zertifikat erstellen =============================== ( http://www.howtoforge.de/anleitung/howto-selbstsigniertes-ssl-zertifikat-erstellen/ ) ( http://www.hack2learn.org/2009/03/16/howto-self-signed-ssl-certificate ) benötigte Dateien und Ordner erstellen cd /home/username mkdir CA cd CA echo '01' >serial touch index.txt Konfigurationsdatei erstellen "/home/username/CA/openssl.cnf "mit folgendem Inhalt: ========================================================= --- begin openssl.cnf # # OpenSSL configuration file. # # Establish working directory. dir = . --- end openssl.cnf Root CA Zertifikat erstellen in openssl.cnf ============================ 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: --- begin [ 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 --- end 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. Kommandozeilen-Optionen Erläuterungen: ============================ 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 Kommando: ( Passwort wird 2 mal abgefragt, gut aufbewahren ! ) openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf Ergebnis: 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. 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 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: --- begin [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash --- end Um zu verhindern das wir jedesmal das gleiche wiederholen müssen auf der Kommandozeile, füge folgendes in die “[ req ]” Sektion nach “distinguished_name”: --- begin distinguished_name = req_distinguished_name req_extensions = v3_req --- end Zertifikat Request erstellen (CSR - Certificate Signing 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. Kommando: openssl req -new -nodes -out req.pem -config ./openssl.cnf Dies erstellt 2 Dateien: - Ein privater Schlüssel in key.pem - Ein Zertifikats signier Request in req.pem Diese Dateien sollten aufbewahrt werden. Wenn 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. Wenn man die Dateien irgendwo abspeichert, ist es wichtig, dass 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. Wir können den Inhalt überprüfen um sicher zu sein vor dem 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”: --- begin [ 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 --- end 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 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. 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 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 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 vgwort /> Howto selbstsigniertes SSL Zertifikat erstellen - Seite 1 Howto selbstsigniertes SSL Zertifikat erstellen - Seite 2