addthis

Mittwoch, 18. Januar 2012

SSL/TLS Verschlüsselung

OpenSSL
systembetreuung scherer

SSL/TLS Verschlüsselung mit OpenSSL

OpenSSL ist ein freies unter einer BSD-Style Lizenz stehendes Toolkit. OpenSSL implementiert die Netzwerkprotokolle Secure Socket Layer (SSL v2/v3) und Transport Layer Security sowie die von diesen Protokollen genutzten Kryptographiestandards.

Die Nutzung dieses Toolkits (bzw. jedem komplexerem) Toolkit erschließt sich dem angehenden Nutzer nicht sofort. Die Managest verwirren im ersten Moment eher, als das sie helfen. Aus diesem Grunde habe ich dieses Dokument verfaßt. Es soll ein kompaktes HOWTO zur praktischen Nutzung von (Open)SSL und Programmen sein, die SSL unterstützen. Neben dem direkten Aufruf des openssl Kommandos mit Schaltern und Optionen wird noch das Script CA.pl mitgeliefert. Dieses stellt ein vereinfachtes Interface zu den einzelnen OpenSSL Kommandos dar. CA.pl arbeitet mit dem Default Configfile oder dem File, das in der UmgebungsvariableOPENSSL_CONF mit vollem Pfad angegeben ist.

Management von Zertifikaten
Erzeugen eines Root Certification Authority Certificate
Eine Root-CA benötigt ein selbstsigniertes Zertifikat, welches mit dem folgenden OpenSSL Aufruf erzeugt wird:

openssl req -new -x509 -keyout ssl_priv.pem -out ca_cert.pem -days 3650

Hiermit wird ein Zertifikat mit einem zugehörigen Private-Key erzeugt. Das Zertifikat ist für den Zeitraum von 10 Jahren gültig. Es sollte sichergestellt werden, daß der Private-Key ausschließlich zum Signieren anderer Zertifikate verwendet wird. Dieser Key ist der sensibelste Teil einer CA-Infrastruktur. Der Zertifikatteil (public Key) dieses Paares wird den Clients (Browsern) zur Verfügung gestellt. Die Clients können die Gültigkeit von Zertifikaten, die mit diesem Private-Key signiert wurden, mit Hilfe des Root-CA Zertifikats (ca_cert.pem) verifizieren.

Die Passphrase, welche beim Erstellen abgefragt wird sollte daher sehr sicher gewählt werden. Bei jedem Signieren eines anderen Zertifikats wird die Passphrase benötigt.

Das Root-CA Zertifikat wird ausschließlich zum Signieren von anderen Zertifikaten benötigt!

Publikation des Root-CA Zertifikats
Zuerst müssen alle für die Verifizierung durch Browser unnötigen Informationen aus dem Zertikat entfernt werden:

openssl x509 -in ca_cert.pem -out ca_cert.crt

Dieses Zertifikat kann auf der Website publiziert werden. Der Webserver sollte einen MIME Eintrag für .crt Files konfiguriert haben:

  <IfModule mod_ssl.c>
      AddType application/x-x509-ca-cert .crt
      AddType application/x-pkcs7-crl    .crl
    </IfModule>
Jetzt können sich die Clients das Zertifikat herunterladen und im Browser installieren. Wenn dieses erfolgt ist, akzeptiert der Browser alle Zertifikate, die mit dem zugehörigen Root-CA Key signiert wurden.

Signieren eines Zertifikats
CSR erzeugen
Um ein von der Root-CA (bzw. untergeordneten CA's) signiertes Zertifikat zu erhalten, wird zuerst ein Certificate Signing Request erzeugt. Dieses erfolgt mit Hilfe des openssl Befehls:

openssl req -new -keyout client-key.pem -out client-req.pem -days 365

ACHTUNG!
Der Common Name CN (eg, YOUR name) ist der Name, für den das Zertifikat erstellt und signiert wird. Bei einer Website ist es der FQDN des VirtuellenHosts, bei einem S/MIME Zertifikat ist es die Emailadresse des Eigentümers.

Der Zertifiat- Request liegt jetzt in der Datei "client-req.pem und kann von der CA signiert werden. Der Private-Key des Zertifiatsbesitzers ist in client-key.pem gespeichert und sollte sicher aufbewahrt werden.

Diese Datei wird nun an die CA gegeben, um sie dort vom Private-Key der Root-CA oder einer untergeordneten CA signieren zu lassen.

CSR von CA signieren
Der CSR, der der CA übergeben wurde wird jetzt mit dem Private-Key der CA signiert.
 
openssl ca -policy policy_anything -config private/openssl.conf \
      -out client-cert.pem -infiles client-req.pem

Die Konfiguration liegt in ./private/openssl.conf. Hier werden in der Sektionauch [CA_default] die Pfade für die CA Zertifikate und Keyfiles angegeben. Wenn -config nicht angegeben wird, werden die Werte aus der eincompilierten Configdatei genommen (/usr/lib/ssl/openssl.conf).

Das fertige signierte Zertifikat ist in der Datei client-cert.pem gespeichert und kann dem Client zurückgegeben werden.

Zertifikatsdaten anzeigen
Die Details eines Zertifikats können mit Hilfe des Befehls

openssl x509 -in client-cert.pem -noout -text

angezeigt werden.

Zertifikat in PKCS#12 (pfx) konvertieren

openssl pkcs12  -nokeys -in cert.pem -export -out cert.pfx -name "NAME"

Zusätzliche (CA-) Zertifikate werden mit dem Schalter -certfile übergeben.

Zertifikat entschlüsseln
Ein Key der in verschlüsselter Form vorliegt (also mit einer Passphrase gesichert ist), kann beim automatischen Restarten von Servern hinderlich sein. Um den Key zu entschlüsseln und die Passphrase zu entfernen ist der folgende Aufruf notwendig:

openssl rsa -in server-rsa-key.pem > server-key.pem

Die Passphrase wird noch einmal benötigt, um den Key zu entschlüsseln. Jetzt kann der Key geladen werden, ohne das eine Passphrase abgefragt wird.

Debugging von SSL- verschlüsselten Protokollen
OpenSSL enthält ein Server- und ein Clientprogramm, welches einfach zum Debugging von SSL Clients- bzw. Servern genutzt werden kann.

s_server
s_server ist ein Serverprogramm, das auch zum Debuggen von Clients genutzt werden kann.

openssl s_server -accept 443 -www

Der Server bindet sich an Port 443 HTTPS. Der Schalter -www bewirkt, daß eine Statusnachricht an den Client zurückgeschickt wird, wenn er eine Verbindung aufgebaut hat. Wenn Key- und Zertifikat nicht an den eincompilierten Orten liegen, müssen diese explizit angegeben werden.

s_client
s_client implementiert einen allgemeinen SSL/TLS Client. Dieser connected sich sich mit dem zu debuggenden Server. Das Programm ist sehr praktisch beim Debuggen von SSL/TLS Problemen.
    
openssl s_client -connect hostname:443

Mit dem obigen Kommando kann ein HTTPS-Server geprüft werden. Nach erfolgreichem Connect können normale HTTP-Befehle abgesetzt werden. Schon beim Verbindungsaufbau werden zahlreiche Informationen über die Verbindung angezeigt. Der Schalter -debug liefert weitere Informationen sowie einen Hex-Dump des Traffics.

Keine Kommentare:

Kommentar veröffentlichen