!!!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 -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 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]
*[CaCert], [http://www.cacert.org] SSL Zertifikate in einem Web-of-Trust signieren

[{Tag Apache SSL CaCert Tomcat}]