SSL-Zertifikate
Aus DebianforumWiki
Dieser Artikel soll erläutern, welchen Sinn und Zweck SSL-Zertifikate haben, wie man sie erzeugt (self-signed als auch mit einer bekannten CA, Certificate Authority) und wie man sie in die gängigen Serverdienste einfügt. Zuletzt werden auch SSL-Clientzertifikate erklärt und erzeugt. TLS ist nicht zu verwechseln mit GPG.
Inhaltsverzeichnis |
Grundlagen
Wenn jemand eine Verbindung über ein SSL-Protokoll (zb https) aufbaut, wird zunächst die Identität des Servers überprüft. Dabei kommt SSL/TLS zum Einsatz (praktisch dasselbe, TLS ist der Name für SSL ab SSL 3.0). Hier wird das eingesetzt, was in diesem Artikel erklärt wird. Das Clientprogramm erhält das von der CA signierte Zertifikat, in welchem unter anderem der Hostname (bzw mehrere) und die ausgebende Stelle (CA) steht. Wird der CA vertraut und der Hostname stimmt überein, können Server und Client eine symmetrische Verschlüsselung aushandeln und die Verbindung wird fortgesetzt.
| |
Hinweis: Sämtliche Key-Erzeugungen im Artikel erfolgen ohne Passwort; um dies zu ändern, bitte noch den Parameter --des3 anfügen für eine zusätzliche symmetrische Verschlüsselung mittels DES. client.pem/server.pem usw. können natürlich auch hostname.pem benannt werden, um sie anschließend einfacher zu organisieren. |
Kürzel im Artikel
- SSL
- Secure Socket Layer
- TLS
- Transport Layer Security, der Name für SSL ab SSL 3.0 (TLS 1.0 == SSL 3.1)
- CA
- Certificate Authority, eine Stelle, welche Zertifikate ausgibt
- PEM
- Dateiendung für ein Base64-kodiertes X.509-Zertifikat (manchmal auch CRT für CeRTificate) und CSR's
- CSR
- Certificate Signing Request, eine Anfrage an die CA, die eingegebenen Serverdaten wie Hostname und Betreiber zu beglaubigen)
- RSA
- Ein asymmetrisches Schlüsselverfahren [1]
- DES
- Ein symmetrischer Verschlüsselungsalgorithmus
- CSR
- Certificate Revocation List, damit werden Zertifikate als ungültig markiert.
Ablauf zum Erhalt eines Server-Zertifikats
Das ist die Kurzfassung, wie man sie mit meist korrekten Befehlen in den meisten How-To's findet.
Eigene CA erzeugen
Nur wichtig ohne externen Anbieter und für Clientzertifikate.
1. Erzeugen eines Keys für die CA
openssl genrsa -out ca.key 4096
2a. Erzeugen eines Zertifikats für die CA, ein Jahr gültig. Wichtig: common name ist der hostname, zb debianforum.de, mehrere Hosts siehe SNI
openssl req -new -x509 -days 365 -key ca.key -out ca.pem
2b. Erzeugen einer (leeren) CRL für das Zertifikat
Zunächst eine Konfiguration anlegen, hier in /etc/ssl/crl.config: (entnommen und angepasst von [2])
[ ca ] default_ca = CA_default # the default ca section [ CA_default ] dir = /etc/ssl # where everything is kept database = $dir/index.txt # database index file. certificate = $dir/certs/ca.pem # the CA certificate crl = $dir/ca.crl # the current CRL private_key = $dir/private/ca.key # the private key default_crl_days = 183 # how long before next CRL default_md = md5
Danach die CRL erzeugen und an das CA-Zertifikat anhängen:
openssl ca -gencrl -config crl.config -out ca.crl cat ca.pem ca.crl > /etc/ssl/certs/ca.pem
Eigenes Zertifikat erzeugen und signieren (lassen)
3. Erzeugen eines Keys für den (eigenen) Server
openssl genrsa -out server.key 1024
4. Erzeugen eines CSR (unterschrieben mit dem Server-Key)
openssl req -new -key server.key -out server.csr
5. Signieren des CSR durch die eigene CA, als Produkt erhält man das Zertifikat. Mit externer CA macht man das dann auf der jeweiligen Webseite des Anbieters (CSR rein, neues Zertifikat raus)
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca.key -out server.pem
Client-Zertifikate
Als passabler Ersatz für basic auth (htaccess) können auch Client-Zertifikate verwendet werden. Dies ist nicht besonders weit verbreitet, vermutlich wegen des leicht erhöhten Aufwands bei der Einrichtung. Die Zertifikate werden wie folgt erzeugt:
1. Erzeugen einer CA (nicht optional!), siehe oben 2. Erzeugen eines Client-Keys
openssl genrsa -out client.key 1024
3. Erzeugen eines Client-CSR
openssl req -new -key client.key -out client.csr
4. Signieren des CSR, Endprodukt ist wieder ein Zertifikat.
openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca.key -out client.pem
5. Export als PKCS#12 Zertifikat
openssl pkcs12 -export -inkey client.key -in client.pem -out client.pfx
Der Serverdienst erhält als Parameter das Zertifikat der CA, um die Clientzertifikate zu überprüfen. Im Client wird dann an passender Stelle das Clientzertifikat (im PKCS#12 Format) hinterlegt.
SNI
Um mehrere Hosts in einem Zertifikat einzubinden, ist SNI vorgesehen. SNI steht für Server Name Indication. Durch SNI wird der Hostname mit dem TLS Handshake übergeben. Damit kann der Dienst das korrekte Zertifikat ausliefern.
Aktuelle Browser unterstützen darüber hinaus das Attribut subjectAltName (definiert im Standard x.509 v3) im Zertifikat, wo auch wildcards erlaubt sind (ebenso im common name, was dann aber nicht mehr abwärtskompatibel ist). Konfiguiert wird dies am besten in der /etc/ssl/openssl.cnf, Beispiel:
[ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = DNS:planet.debianforum.de, DNS:nopaste.debianforum.de
Bei der Generierung des CSR wird dies dann miteingebunden.
Konfiguration verschiedener Serverdienste und Clients
Im Folgenden wird beschrieben, wie verschiedene Dienste wie https/imaps mit dem erzeugten Zertifikat konfiguriert werden.
Apache
Serverzertifikat
Der entsprechende VirtualHost muss wie folgt konfiguiert werden:
SSLEngine On SSLCertificateFile /etc/ssl/certs/server.pem SSLCertificateKeyFile /etc/ssl/private/server.key
Es gibt auch die Möglichkeit, den Key und das Zertifikat in eine Datei zu kopieren und als SSLCertificateFile anzugeben.
Clientzertifikat
Für Logins mit Clientzertifikaten gibt man im betreffenden VirtualHost bzw. einer Verzeichnisdirektive folgendes an:
SSLVerifyClient require SSLCACertificateFile /etc/ssl/certs/ca.pem
An der Stelle sei noch angemerkt, dass auch pro Benutzer mit Zertifikaten (anhand des Email-Felds) gearbeitet werden kann. Dies ist jedoch etwas komplizierter und basiert auf zwei unterschiedlichen Methoden, siehe [3] [4]
ToDo
Nginx
Serverzertifikat
In die Konfigurationsdatei des VirtualHost wird eingetragen:
ssl on; ssl_certificate /etc/ssl/certs/server.pem; ssl_certificate_key /etc/ssl/private/server.key;
Clientzertifikat
ssl_client_certificate /etc/ssl/certs/ca.pem; ssl_verify_client on;
Dovecot
| |
Hinweis: Die von debian mitgegebene Konfiguration enthält bereits die meisten Parameter in auskommentierter Form. Es bietet sich an, diese zu suchen und anzupassen anstatt selbst einzufügen, sofern vorhanden. |
Serverzertifikat
Vorab: Das Serverzertifikat kann mittels dpkg-reconfigure dovecot-common auch automatisch erzeugt werden (self signed). Wer sich also Arbeit sparen will, ist damit gut bedient. Wer es mit dem bereits oben angelegten Zertifikat machen will, hier die Konfiguration:
Für "reines SSL" muss imaps zur protocols-Zeile hinzugefügt und im Abschnitt protokoll imap ssl_listen mit IP:Port angegeben werden (analog für pop3 mit pop3s).
protocol imap {
listen = *:143
ssl_listen = *:993
}
Es gibt jedoch praktisch keinen Unterschied zwischen IMAP mit TLS und IMAPS außer dem zusätzlichen Port und einem Zwischenschritt mit STARTTLS.
Das Zertifikat wird wie folgt angegeben:
ssl_cert_file = /etc/ssl/certs/server.pem ssl_key_file = /etc/ssl/private/server.key
dovecot kann auch mit DES-geschützten Zertifikaten umgehen, dann muss/kann
ssl_key_password = passwort
gesetzt werden (alternativ wie bei anderen Diensten beim Start). Außerdem sollte dann der Zugriff auf die Datei /etc/dovecot/dovecot.conf limitiert werden:
chmod 600 /etc/dovecot.conf
Clientzertifikat
Um dovecot für Zertifikate fit zu machen, benötigt dovecot das Zertifikat der (eigenen) CA. Setzt man ssl_verify_client_cert auf yes, wird der Client nach einem Zertifikat gefragt, mit gesetztem ssl_require_client_cert=yes im Bereich auth kann man sich via IMAP/POP3 nur noch mit Zertifikat anmelden.
ssl_ca_file = /etc/ssl/certs/ca.pem ssl_verify_client_cert = yes ssl_require_client_cert= no
Das Clientzertifikat ersetzt jedoch nicht den Login-Mechanismus!
Postfix
Serverzertifikat
Um Postfix TLS beizubringen, benötigt es folgendes in der /etc/postfix/main.cf:
smtpd_tls_cert_file=/etc/ssl/certs/server.pem smtpd_tls_key_file=/etc/ssl/private/server.key smtpd_use_tls=yes
Clientzertifikat
Auch über SMTP sind Zertifikate möglich und können wahlweise optional oder erforderlich sein.
smtpd_tls_ask_ccert = yes # Um die Funktionalität grundsätzlich zu aktivieren smtpd_tls_req_ccert = yes # Um Zertifikate erforderlich zu machen, impliziert die vorige Direktive smtpd_tls_security_level = encrypt # Keine Authentifikation ohne TLS, empfohlen smtpd_tls_CAfile = /etc/ssl/certs/ca.pem
Firefox/Iceweasel
ToDo
Chromium
ToDo
Opera
ToDo
Thunderbird/Icedove
ToDo
Quellen
- http://www.openssl.org/docs/HOWTO/keys.txt
- http://www.postfix.org/TLS_README.html
- http://pilif.github.com/2008/05/why-is-nobody-using-ssl-client-certificates/
- http://www.tc.umn.edu/~brams006/selfsign.html
- http://www.lwithers.me.uk/articles/cacert.html
- http://wiki.dovecot.org/SSL/DovecotConfiguration