{title: Zertifikat-Erstellung mit openssl} {author: Lars} {date: 15. September 2003} {version: 0.1} {abstract: Eine Beschreibung der Erstellung von Zertifikaten fuer den Apache-Webserver, sowie deren Signierung durch eine selbsterstellte Certificate Authority (CA)} = Ein langer Weg ... = Die Erstellung eines Zertifikats ist ein mehrstufiger Vorgang. Im Folgenden werde ich dessen Zwischenergebnisse kurz beschreiben (in Klammern sind die spaeter verwendeten Dateierweiterungen angegeben): Schluessel (key):: ein (asymmetrisches) rsa-Schluesselpaar mit gewaehlter Schluessellaenge (hier: 1024, groessere Schluessel werden von manchen Browsern nicht verstanden) Schluesselinformationen (req):: Herkunftsinformationen, die dem Nutzer gezeigt werden, wenn er das Zertifikat annehmen soll; wichtig dabei ist der "Common Name" (CN) - im Falle des Webservers sollte es die URL der betreffenden Domain sein Certificate Signing Request (csr):: die Kombination aus Schluessel und dazugehoerigen Informationen; dies laesst sich bereits zur Verschluesselung per ssl verwenden, jedoch ist es hier moeglich, die Informationen unabhaengig vom Schluessel zu manipulieren, bzw. umgekehrt Zertifikat (crt):: der beschriebene "Certificate Signing Request" wird mit dem privaten Schluessel einer Certificate Authority (CA) signiert und ist somit vor unbemerkten Manipulationen geschuetzt ? (pem):: Beispiele siehe ''/etc/ssl/certs'' - zum Verifizieren (beispielsweise einer CA) noetig = Die Erstellung des "Certificate Signing Request" = * '''openssl genrsa 1024 >$ZIEL.key''' erzeugt den Schlussel mit 1024 Bit Schluessellaenge * durch den zusaetzlichen Parameter '''-des3''' liesse sich der Schluessel symmetrisch per Triple-DES verschluesseln, um unbefugte Verwendung zu verhindern (dies erfordert bei jedem Start des Webservers die Eingabe des Passworts) * der Parameter '''-rand QUELLE''' erlaubt die Verwendung einer (endlich grossen) Datei als Quelle der genutzten Zufallszahlen zur Schluesselgenerierung * '''openssl req -x509 -key $ZIEL.key -new > $ZIEL.req''' erfragt die Meta-Informationen * mit dem zusaetzlichen Parameter '''-days X''' kann die Gueltigkeitsdauer des Zertifikats festgelegt werden (Standard: 30 Tage) * '''cat $ZIEL.key $ZIEL.req > $ZIEL.csr''' fuegt beides zusammen zum "Certificate Signing Request" * dieser laesst sich nun als (unbeglaubigtes) Zertifikat fuer einen SSL-Webserver verwenden = Die Erstellung einer Certificate Authority = Die folgenden Schritte sind nur einmal erforderlich, um die Quelle des Vertrauens zu erschaffen. * da openssl einige sehr eigenwillige Bedingungen an die manuelle Verwendung von '''openssl''' zur Verwaltung einer CA knuepft, ist die Nutzung eines bereits existierenden Skripts '''CA.sh''' nahezu unvermeidlich * das Skript kann sich beispielsweise im Verzeichnis '''/usr/lib/ssl/misc''' befinden * dieses Skript erzeugt beim Aufruf mit dem Parameter '''-newca''' das CA-Zertifikat * dies sollte mit einem Passwort gesichert werden, um eine Kompromittierung der CA auszuschliessen = Die Signierung des Certificate Signing Request = * aufgrund der eingeschraenkten Parametrierbarkeit des CA.sh-Skripts muss die vorher erzeugte csr-Datei in das Verzeichnis, in dem sich das Unterverzeichnis "demoCA" befindet, kopiert werden * ausserdem muss die Datei jetzt "newreq.pem" heissen * nun erzeugt '''CA.sh -signcert''' das Zertifikat als "newcert.pem" = Ein Beispiel-Skript = Das folgende Skript erwartet als Parameter den Namen des zu erstellenden Zertifikats (ohne Dateinamen-Erweiterung). (zu finden unter ''/home/scripts/makeCert.sh'') `` `#!/bin/sh` `` `CA_DIR=/home/certificates/` `# enthaelt das Verzeichnis "demoCA" (siehe unten: CA-Erzeugung)` `DAUER="-days 365"` `TMPREQ=/tmp/mein-apache-cert.req` `TMPRAN=/tmp/mein-apache-cert.random` `CSR_FILE=$1.csr` `KEY_FILE=$1.key` `CRT_FILE=$1.crt` `if test -z "$1";` ` then echo "Syntax: $0 ZERTIFIKATS-DATEI [CA-Datei]"` ` echo " (die Dateienedungen (key, csr, crt) werden automatisch angefuegt)" ` ` exit 1` ` fi` `echo "Erzeuge Zufallszahlen ..."` `echo "-----------------------------------------------"` `dd if=/dev/urandom of=$TMPRAN bs=1024 count=1024 || exit 2` `sleep 1` `echo -e "\nErzeuge den Schluessel ..."` `echo "-----------------------------------------------"` `openssl genrsa -rand $TMPRAN 1024 > $KEY_FILE || exit 3` `# z.B.: -des3 um Verschluesselung des Zertifikats zu aktivieren ` `echo -e "\nErzeuge die X509-Informationen ..."` `echo "-----------------------------------------------"` `openssl req -x509 -key $KEY_FILE $DAUER -new > $TMPREQ || exit 4` `echo -e "\nFuege das Zertifikat zusammen ..."` `echo "-----------------------------------------------"` `cat $TMPREQ $KEY_FILE >$CSR_FILE || exit 5` `echo -e "\nLoesche temporaere Dateien ..."` `echo "-----------------------------------------------"` `rm $TMPRAN $TMPREQ` `echo -e "\nDie Signierungsanforderung $CSR_FILE wurde erzeugt!"` `test -e "$CA_DIR" || exit 0` `# nun wird per CA zertifiziert ...` `# die CA wird erstmalig durch das Skript CA.sh mit dem Parameter "-newca" erstellt` `AKT_DIR=`pwd`` `echo -e "\nDiese wird nun von der CA signiert ...\n"` `cp $CSR_FILE ${CA_DIR}newreq.pem` `cd $CA_DIR` `test -f newcert.pem && rm newcert.pem` `openssl x509 -x509toreq -in newreq.pem $DAUER -signkey newreq.pem -out tmp.pem || exit 6` `openssl ca -policy policy_anything -out newcert.pem -infiles tmp.pem || exit 7` `test -f tmp.pem && rm tmp.pem` `if test ! -s newcert.pem;` ` then echo "Fehler: das neue Zertifikat wurde nicht erstellt!"` ` exit 8` ` fi` `rm newreq.pem` `mv newcert.pem ${AKT_DIR}/$CRT_FILE || exit 9` `cd $AKT_DIR` `rm $CSR_FILE` `echo -e "\nFertig!"` `` = Namenskonventionen = (falls du ihnen folgen magst) Country Name [AU]:: . [ein ''Punkt'' bedeutet ''leeres Feld''] State or Province [Some-State]:: . Locality Name:: Airstrip One Organization Name [ON]:: AG Kommunikation Organizational Unit:: selber ausdenken