{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) <nowiki> #!/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!" </nowiki>
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