X.509

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Betrieb einer CA

Wer nur wenige Zertifikate verwalten muss, ist mit dieser X.509 Lösung gut bedient. Wer jedoch viele Zertifikate verwalten muss, sollte sich mal den Artikel ejbca ansehen.

X.509 mit OpenSSL

Zu einer X.509 Infrastruktur gehört immer ersteinmal eine Root-CA. Man kann da kommerzielle Anbieter, wie z.B. Verisign bemühen, aber das kostet richtig Geld - oder man macht alles selbst. Ansonsten gibt es noch CAcert, dort kann man sein Zertifikat ebenfalls signieren lassen. Bei dem Stammtisch können CAcert "Assurance Punkte" vergeben werden. Bitte aber vorher in der Mailingliste bescheid sagen, so dass die CAcert Assurer wissen, dass etwas zu tun ist...

Smartcards

Unter X.509 mit Smartcards wird beschrieben, wie man X.509 mit Smartcards implementiert und ssh mit Smartcards einsetzt.

Quellen für OpenSSL

Den Sourcecode gibt es unter http://www.openssl.org, bei den meisten Linuxdistributionen liegt es als Paket bei. Bei Debian wird es mit apt-get install openssl installiert. Für Windows gibt es unter http://www.slproweb.com/products/Win32OpenSSL.html fertige Binaries.

Root CA generieren

Dazu wird das Skript CA.pl verwendet, es ist Teil des OpenSSL Sourcecodes. Nach dem Auspacken des Archivs ist sie unter ./openssl-.../apps/CA.pl zu finden. Bei Debian ist sie unter /usr/lib/ssl/misc/CA.pl zu finden, wenn man mit apt-get install openssl die Installation von OpenSSL vorgenommen hat.

Die CA sollte sich auf einem PC ohne Netzwerkanbindung befinden. Der PC sollte auch ausschließlich für CA Aufgaben verwendet werden. Ein alter Notebook mit einer 400MHz CPU und 1 GByte Platte sind hier völlig ausreichend, wenn man auf ein GUI verzichten kann. Ein USB Stick für den private Key sollte auch vorhanden sein. Der USB Stick ist dann quasi der Schlüssel für die CA und sollte bei Nichtgebrauch sicher aufbewahrt werden.

Bevor wir nun unsere CA in Berieb nehmen können, ist wieder mal der vi oder ein anderer Editor gefragt. Zunächst wird die Default openssl.cnf in das CA Verzeichnis kopiert, das hier in den Beispielen mit

mkdir /home/ca

angelegt wurde. Damit die verwendeten Skripte auch wissen, welche openssl.cnf zu verwenden ist, wird mit

export SSLEAY_CONFIG="-config /home/ca/openssl.cnf"

diese Datei im Environment festgelegt. Nun sollten ein paar Grundeinstellungen vorgenommen werden:

[ CA_default ]
dir             = /home/ca/pugCA        # Hier findet die OpenSSL "Buchführung" statt
default_days    = 365                   # Solange gilt ein Zertifikat (default)
                                        # Für die Einrichtung der CA sollte da ein
                                        # größerer Wert eingetragen werden, z.B. 7300
default_crl_days= 30                    # In diesen Abständen sollten CRL Listen publiziert werden
policy          = policy_anything       # Damit wird eine Policy festgelegt
                                        # Je nach Policy müssen bestimmte Felder des Subjects mit der
                                        # CA übereinstimmen
# For the CA policy
# Hier müssen countryName, stateOrProvinceName und organizationName
# Mit denen der CA übereinstimmen.
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

# For the 'anything' policy
# Hier werden alle Werte mit beliebigem Inhalt akzeptiert, aber
# diese Felder des Subjects müssen vorhanden sein
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

Im folgenden Abschnitt der openssl.cnf können nun Defaultwerte gesetzt werden, die Benutzung von OpenSSL erleichtern. Die Namen der Felder sprechen eigentlich für sich und bedürfen keiner weiteren Erklärung.

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = DE
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Hessen
localityName                    = Locality Name (eg, city)
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Penguin User Group
organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Trustcenter
commonName                      = Common Name (eg, YOUR name)
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name

Unter [ v3_ca ] sollten für eine richtige CA noch folgende Daten hinzugefügt werden:

crlDistributionPoints           = URI:http://ca.pug.org/crl.pem
nsCaRevocationUrl               = http://ca.pug.org/taunusstein.net-crl.pem
nsBaseUrl                       = http://ca.pug.org
nsRevocationUrl                 = https://ca.pug.org/revoke.php
nsRenewalUrl                    = https://ca.pug.org/renew.php
nsCaPolicyUrl                   = http://ca.pug.org/ca-policy.html

Damit ist im Root Zertifikat auch festgelegt, unter welchen URLs Revocation Lists etc. zu finden sind. ca.pug.org muss natürlich durch den eigenen Server ersetzt werden.

In unser CA Verzeichnis wird nun die vorhandene CA.pl kopiert. Hier sollten sich dann openssl.cnf und CA.pl befinden. Will man nicht als CA Verzeichnis demoCA haben, dann muss man in der CA.pl noch die Zeile

$CATOP="/home/ca/pugCA";

eintragen werden. Die Zeile $CATOP="./demoCA"; ist zu entfernen.

Nun können wir endlich unsere CA anlegen. Von dem CA.pl Skript werden alle Dateien und Verzeichnisse automatisch angelegt. Bevor wir unsere neue CA generieren, sollte noch die Zeile

$CADAYS="-days 1095";   # 3 years

durch

# $CADAYS="-days 1095";   # 3 years
$CADAYS="-days 7300";

ersetzt werden. Damit ist unser Root Zertifikat für rund 30 Jahre gültig. Unsere Root CA wird nun endlich mit

CA.pl -newca

erstellt. Es wird nach einer Passphrase gefragt. Weiterhin werden auch Name und diverse andere Daten abgefragt. Diese erscheinen dann im CA Zertifikat und allen Zertifikaten, die von dieser CA signiert werden. Die Passphrase sollte nicht zu einfach sein und sollte an einem sicheren Ort aufbewahrt werden. Es entsteht ein Verzeichnisbaum pugCA, in dem zwei Dateien zu finden sind:

private/cakey.pem cacert.pem

Die cacert.pem muss veröffentlicht werden, das ist das öffentliche CA Zertifikat.

Zertifikat generieren

Dieser Vorgang kann auf jedem Client durchgeführt werden, der sich von unserer PUG CA ein Zertifikat signieren lassen will. Die Datei server.key wird keinesfalls weitergegeben, weil diese den private Key enthält. Nur die Datei server.csr ist an die CA zu übergeben. Von der CA erhält man eine server.crt zurück. Es werden zunächst ein Key und ein Signing Request erzeugt:

openssl req -config /home/ca/openssl.cnf \
-subj "/C=de/ST=Hessen/L=Wiesbaden/O=pug.org/OU=Tux/CN=www.pug.org/emailAddress=nobody@example.com" \
-newkey rsa:4096 -keyout server.key -out server.csr

Hier ist erneut eine Passphrase einzugeben. Diese sollte (oder besser - darf) nicht mit der CA Passphrase identisch sein. Man kann die Daten unter -subj natürlich auch anders setzen, das soll hier nur ein Beispiel sein. Mit

openssl req -noout -subject -in server.csr

Kann man sich das Subject des Requests ansehen. Wird auf ein X.509 Zertifikat referenziert, so ist damit immer der Inhalt des Subjects gemeint. Bei der Erstellung von Zertifikaten muss immer darauf geachtet werden, dass das Subject innerhalb der CA eindeutig ist. Wenn bei der CA alles richtig konfiguriert ist, dann wird OpenSSL eine Signierung eines Zertifikats mit nicht eindeutigem Subject mit einer Fehlermeldung verweigern. Leider sagen die OpenSSL Fehlermeldungen nur wenig oder nichts über die tatsächliche Fehlerursache aus, sondern man bekommt nur cryptische Library Fehlermeldungen.

Elliptische Kurven

OpenSSL erlaubt es auch Schlüssel auf der Basis von Elliptischen Kurven zu erzeugen.

umask 177
CURVETYPE=sect571r1
openssl ecparam -out www.pug.org.key -name ${CURVETYPE}  -genkey
umask 022

erzeugt einen privaten Schlüssel nach dem Standard ect571r1. Mit

openssl req \
-new \
-subj "/CN=www.pug.org" \
-key www.pug.org.key -out www.pug.org.csr

kann wie gewohnt ein CSR erstellt werden. Eine Warnung noch: Apache kann mit Schlüsseln, die auf Elliptischen Kurven basieren, (noch) nichts anfangen.

Zertifikat signieren

Die CA benötigt nur die server.csr Datei. Diese wird nun signiert:

openssl ca -config /home/ca/openssl.cnf -batch \
-keyfile pugCA/private/cakey.pem -cert pugCA/cacert.pem \
-in server.csr -days 365 -out server.crt -notext

Die nun entstandene server.crt Datei ist dem Benutzer zu übergeben. Der Parameter -days kann natürlich auch einen anderen Wert als 365 enthalten. Entsprechend lange ist das Zertifikat gültig.

Wer auch hier CA.pl verwenden will kann statt des o.g. Kommandos das auch wie folgt tun:

ln -s server.csr newreq.pem
./CA.pl -sign

Nach Angabe des CA Passworts hat man ein signiertes Zertifikat.

Zertifikat exportieren

Dafür gibt es das PKCS12 Format. Zunächst muss man die drei Komponenten

  • CA Zertifikat
  • private Key des beantragten Zertifikats
  • Signiertes Zertifikat

in eine Datei kopieren. Mit

cp pugCA/cacert.pem tmp-cert
cat server.key >> tmp-cert
cat server.crt >> tmp-cert
openssl pkcs12 -export -in tmp-cert > server.pkcs12

Zunächst muss man die Passphrase des private Keys angeben, danach ist eine Passphrase festzulegen, mit der das PKCS12 Päckchen verschlüsselt wird. Dies ist notwendig, weil der private Key entschlüsselt wird, wenn ein PKCS12 File erzeugt wird.

Anwendungen

Hier ein paar Anmerkungen und Besonderheiten bei verschiedenden Anwendungen

Webserver (SSL)

Wird das Zertifikat für einen Webserver verwendet, dann muss bei Request als CN der Hostname angegeben werden. Im o.g. Beispiel ist das www.pug.org. Damit kann man dann https Aufrufe auf den betreffenden Server machen. Die cacert.pem, die man auch nach ca.crt umbenennen kann, sollte der Benutzer installieren. Es reicht ein einfacher Link auf diese Datei, der Browser erkennt dann diesen Dateityp automatisch.

Damit der Apache ohne Passwort starten kann, muss der private key unverschlüsselt gespeichert werden. Hier besteht ein großes Risiko, also nur machen, wenn man weiss, was man da tut.

umask 177
openssl rsa -in server.key -out server-uncrypted.key

In der ssl.conf muss nun server-uncrypted.key verwendet werden. Es versteht sich hier von selbst, dass ausser Root niemand irgendwelche Rechte auf dieses File hat, muss also max. -rw------- sein.

IPsec

OpenCA, racoon und isakmpd können X.509 Zertifikate zur Authentifizierung benutzen. Auch Windows XP kann solche X.509 Zertifikate benutzen.


E-Mail Verschlüsselung

Thunderbird und Mozilla unterstützen S/MIME, dieses benutzt X.509 Zertifikate zum Verschlüsseln und signieren.


TLS-SMTP

Sendmail, Postfix und Exim4 können mit X.509 Zertifikaten Authetifizieren und verschlüsseln. Die Verschlüsselung ist allerdings nicht sehr wirksam, weil nur zwischen den beiden, miteinander kommunizierenden MTAs eine Verschlüsselung stattfindet.


POPS / IMAPS

Auch hier werden X.509 Zertifikate verwendet. Für Cyrus gibt es da ein sehr gutes How-To

Besonderheiten bei einer Windows 2003 Server CA

Bevor ein Windows 2003 sich einer mit OpenSSL generierten CA unterordnet, werden gewisse Anforderungen an die Root CA gestellt, die in der openssl.conf erfüllt werden können:

x509_extensions = v3_ca                       # V3 Extensions werden unterstützt
nsCertType = server, client, email, objsign   # Diese CA ist für alles zuständig, was signierbar ist

[ v3_ca ]
# die folgenden Pfade müssen existieren und für den Windows Server
# zugreifbar sein !!!
crlDistributionPoints           = URI:http://ca.pug.org/ca/crl.pem
nsCaRevocationUrl               = http://ca.pug.org/ca/crl.pem
nsBaseUrl                       = http://ca.pug.org/ca
nsRevocationUrl                 = http://ca.pug.org/ca/revoke.php
nsRenewalUrl                    = http://ca.pug.org/ca/renew.php
nsCaPolicyUrl                   = http://ca.pug.org/ca/policy.html

Nur dann akzeptiert Windows 2003 Server ein mit einer openssl CA signiertes Zertifikat. Weiterhin müssen die oben mit "mandatory" gekennzeichneten Felder im Certificate Request zur CA passen.

Christian