!!!X509 Zertifikate mit OpenSSL
{{{
V E R W U N D B A R K E I T
Mitte Mai 2008 ist eine Verwundbarkeit in OpenSSL
unter Debian erkannt worden, die alle Schlüssel
betrifft, die seit ca. 2006, also seit Debian Etch
erzeugt wurden. Das betrifft Dienste wie
SSH(!), OpenVPN, SSL, u.a.
Bitte schließt als erstes alle öffentlichen Ports
Eures Systems und lest dann
http://www.debian.org/security/2008/dsa-1571
http://wiki.debian.org/SSLkeys
}}}
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 -new -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.org__ 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_keyfile
}}}
Achtung: Ein ungeschütztes Keyfile muss natürlich besonders geschützt sein!
!!Mehrere ~VirtualHosts
Eigentlich kann man pro IP-Adresse nur ein Zertifikat hinterlegen, so dass man pro Domain mit __https__-Verschlüsselung eine eigene IP-Adresse braucht.
Bei CaCert sind aber Möglichkeiten beschrieben, wie man in einem Zertifikat mehrere Domain-Namen unterbringt: siehe [http://wiki.cacert.org/wiki/VhostTaskForce]
Eine Möglichkeit ist es mehrere Common Names im Zertifikat zu haben, dazu trägt man Folgendes in die Konfiguration von ~OpenSSL
(__/usr/lib/ssl/openssl.cnf__) ein:
statt
{{{
commonName = Common Name (eg, YOUR name)
commonName_max = 64
}}}
schreibe
{{{
0.commonName = Common Name 1
0.commonName_max = 64
1.commonName = Common Name 2
1.commonName_max = 64
2.commonName = Common Name 3
2.commonName_max = 64
}}}
!!~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.
!!Links
Gegenüberstellung __keytool__ und __openssl__:\\
[http://www.m1b.de/content/know/security/x509/cert_openssl.html]
[{Tag Apache SSL}]