OpenSSL#
Table of Contents
- OpenSSL
- X509 Zertifikate mit OpenSSL
- Passphrase entfernen
- Mehrere VirtualHosts
- SNI
- Multidomain-Zertifikate
- Selbstsigniertes Zertifikat erstellen
- OpenSSL Zertifikat mit Tomcat
- Zertifikate mit eigener Certificate Authority (CA) zertifizieren
- OpenSSL als Alterative zu telnet
- Gültigkeit von TLS Zertifikaten prüfen
- Prüfung auf TLS1.0
- Links
X509 Zertifikate mit OpenSSL#
X509 Zertifikate werden unter Linux normalerweise mit OpenSSL erstellt.
Ich beschreibe hier, wie ich einen privaten Schlüssel und einen Request für eine CA (Authorisierungsstelle) anlege:
openssl req -newkey rsa:2048 -days 370 -nodes -sha256 -out example.csr -keyout example.key
- example.csr
- enthält den Request
- example.key
- enthält den privaten Schlüssel
Die Datei example.crt mit dem Zertifikats-Requests lasse ich dann (z.B. durch Hochladen bei CaCert oder durch einen kommerziellen Anbieter) signieren. Ich erhalte eine Datei zurück, die ich example.pem nenne.
Dann muss das Zertifikat noch in die Apache-Konfiguration eingetragen werden, z.B. so:
<VirtualHost _default_:443> DocumentRoot /var/example/www/ ServerName www.example.org:443 ServerAlias example.org:443 ServerAdmin webmaster@example.org SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /etc/apache2/ssl.crt/example.pem SSLCertificateKeyFile /etc/apache2/ssl.crt/example.key <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews Includes AllowOverride None Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined ServerSignature On </VirtualHost>
Passphrase entfernen#
Im Serverbetrieb ist es kaum möglich, bei jedem Start des Apache eine Passphrase für den SSL-Schlüssel anzugeben. Deshalb entferne ich die Passphrase mit dem folgenden Kommando:
openssl rsa -in keyfile -out new_keyfileAchtung: Ein ungeschütztes Keyfile muss natürlich besonders geschützt sein!
Mehrere VirtualHosts#
Ursprünglich konnte man pro IP-Adresse nur ein Zertifikat hinterlegen, so dass man pro Domain mit https-Verschlüsselung eine eigene IP-Adresse brauchte.
SNI#
Abhilfe schafft hier der Standard "SNI" (Server Name Indication. SNI ist eine Erweiterung von TLS und ermöglicht es den angeforderten Domainnamen vor dem Umschalten auf eine verschlüsselte Übertragung zu übermitteln, so dass der Server das passende Zertifikat auswählen kann.
Multidomain-Zertifikate#
Alternativ kann das vorgezeigte Zertifikat eine Erweiterung mit mehreren alternativen Domainnamen enthalten. Ein Beispiel für eine OpenSSL Konfiguration, die die Wildcard-Domain "*.example.com" und die 2nd-Level Domain "example.com" enthält findet Ihr unten.
[req] prompt = no distinguished_name = req_dn x509_extensions = v3_ca [req_dn] commonName = *.example.com countryName = DE stateOrProvinceName = Germany localityName = Krefeld organizationName = Example Organization emailAddress = info@example.com [v3_ca] basicConstraints = CA:FALSE extendedKeyUsage=serverAuth subjectAltName=DNS:*.example.com,DNS:example.com
Mit dieser Konfiguration lässt sich wie folgt ein Zertifikat-Request erzeugen:
openssl req -newkey rsa:2048 -keyout example.key -out example.csr -days 1100 -nodes -sha256 -config openssl.cnf
Selbstsigniertes Zertifikat erstellen#
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 1100 -nodes -subj '/CN=example.com'
OpenSSL Zertifikat mit Tomcat#
Tomcat unterstützt neben den "normalen" Java ("jks") Keystore-Dateien auch PKCS12-Keystores. Einen solchen Keystore kann man mit OpenSSL erstellen:
openssl pkcs12 -export -in example.pem -inkey example.key -out .keystore.p12 \ -name tomcat -certfile class3.crt -passout pass:geheim
In der server.xml des Tomcat sieht der https-Connector dann zum Beispiel so aus:
<Connector port="8443" proxyPort="443" maxHttpHeaderSize="8192" maxThreads="10" minSpareThreads="3" maxSpareThreads="7" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore.p12" keystorePass="geheim" keystoreType="PKCS12" />
Siehe auch TomcatSSL.
Zertifikate mit eigener Certificate Authority (CA) zertifizieren#
Wer seine Zertifikate nur intern benutzt, kann sich auch eine eigene, private CA erzeugen. Das kann sinnvoll sein, um innerhalb eines Unternehmens eine ganz private Hierarchie von Zertifikaten zu haben (z.B. für OpenVPN) oder einfach, weil es schneller geht. Im übrigen zertifiziert CaCert keine nicht-öffentlichen Schlüssel, die keiner offiziellen Internet-Domain zugeordnet sind.
Ich habe hier einen Artikel gefunden, der ein Skript benutzt, das Teil des openssl-Paketes ist. Allerdings ist dessen Benutzung extrem kompliziert, schlecht erklärt und das Skript nicht zu konfigurieren. In diesem Artikel steht dann aber ganz einfach erklärt, wie es ohne das Skript geht. :-) (Außerdem versteht man dabei ungefähr, was die einzelnen Schritte machen.)
OpenSSL als Alterative zu telnet#
Heute ist die Authentifizierung bei SMTP oder POP3 über unverschlüsselte Verbindungen (aus guten Gründen) in der Regel nicht mehr zulässig. Man kann einen SMTP-Server also nicht mehr ohne weiteres per telnet testen.
Als Alternative nutze ich OpenSSL:
ich@computer:~$ openssl s_client -starttls pop3 -ign_eof -crlf -connect mail.example.com:110 ich@computer:~$ openssl s_client -starttls smtp -ign_eof -crlf -connect mail.example.com:25
oder für HTTPS
ich@computer:~$ openssl s_client -crlf -servername www.example.com -connect www.example.com:443
(die Option "-servername" wird für SNI notwendig)
oder für FTP
ich@computer:~$ openssl s_client -starttls ftp -connect ftp.example.com:21
Gültigkeit von TLS Zertifikaten prüfen#
Ist das Zertifikat für die HTTPS-Domain beispiel.de noch mindestens 24 Stunden (= 86400 Sekunden) gültig?
ich@computer:~$ echo|openssl s_client -connect beispiel.de:443 -servername beispiel.de 2>/dev/null|openssl x509 -noout --checkend 86400
Prüfung auf TLS1.0#
Ich möchte prüfen, ob meine Mailserver noch TLS1.0- oder TLS1.1-Verbindungen zulässt. Eigentlich sollte das deaktiviert sein:
ich@computer:~$ openssl s_client -connect beispiel.de:110 -starttls pop3 -tls1_1 [ -tls1 / -tls1_2 ]
Links #
- Gegenüberstellung keytool und openssl:
http://www.m1b.de/content/know/security/x509/cert_openssl.html - CaCert, http://www.cacert.org SSL Zertifikate in einem Web-of-Trust signieren
- http://www.madboa.com/geek/openssl/ - gute Doku, Tipps zum Prüfen von Zertifikaten
- Java Keystore über PKCS12 erzeugen