TLS-Einrichtung mit Apache2#

Hinweis

Das gleiche Konzept, wie hier beschrieben, kann für viele Anwendungen verwendet werden, die openssl als Krypto-Backend verwenden. Das Konzept läuft im Wesentlichen auf Folgendes hinaus: Ersetzen Sie die (geheime) Schlüsseldatei durch eine PKCS#11-URL, die einen Schlüssel auf einem Sicherheits-Token (Nitrokey) referenziert.

Vorbereitung#

  • Stellen Sie sicher, dass die apache2-Version mindestens 2.4.42 ist, um mod_ssl zu unterstützen

  • Aktivieren Sie mod_ssl mit a2enmod ssl, falls noch nicht geschehen

  • zusätzlich wird openssl benötigt und libengine-pkcs11-openssl siehe PKCS#11 URL

Konfigurieren des Apache2 zur Verwendung eines Sicherheitsschlüssels#

Im Grunde müssen Sie nur SSLCertificateFile durch die richtige PKCS#11-URL ersetzen und alle anderen Verweise auf Schlüssel oder Zertifikate löschen. Z. B. wird SSLCertificateKeyFile nicht mehr benötigt.

Eine Beispiel-Direktive könnte wie folgt aussehen:

SSLCertificateFile   "pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0123123;token=UserPIN%20%28SmartCard-HSM%29;id%01"

Die richtige PKCS#11-URL kann wie in PKCS#11-URL-Generierung dokumentiert extrahiert werden

Achten Sie darauf, die Direktive innerhalb einer VirtualHost-Konfiguration zu platzieren.

PIN beim Start von Apache2 bereitstellen#

Mit der zuvor beschriebenen Methode fragt der Apache2 bei jedem Start nach der User-PIN und lehnt damit grundsätzlich einen Batch-Start ab. Der Apache2 bietet eine weitere Direktive, um die PIN beim Start bereitzustellen.

SSLPassPhraseDialog     "|/bin/echo 123456"

Apache2 erwartet nach | eine ausführbare Datei, die beim Start ausgeführt wird und deren Ausgabe (nachfolgender Zeilenumbruch wird erwartet) als PIN verwendet wird. Offensichtlich lassen sich mit diesem Ansatz beliebig komplexe Methoden zur PIN-Abfrage implementieren. Obwohl hier ein triviales Beispiel gewählt wurde, um die PIN während des Starts einfach echo zu geben.

Weiterhin ist SSLPassPhraseDialog eine globale Direktive, muss also im Apache2 in den globalen Konfigurationsbereich gelegt werden.

Warnung

Das gezeigte Beispiel ist kein sicherer Mechanismus zur Übergabe der PIN, da sie im Klartext in der Konfiguration geschrieben wird

Weitere Einzelheiten zu dieser Funktion finden Sie in der Apache2 mod_ssl-Dokumentation.

Vollständiges Apache2-Konfigurationsbeispiel#

Ein kompletter Apache2 (VirtualHost) Konfigurationsausschnitt könnte wie folgt aussehen:

<IfModule mod_ssl.c>
  SSLPassPhraseDialog     "|/bin/echo 123456"
  <VirtualHost _default_:443>
     ServerAdmin webmaster@localhost

     DocumentRoot /var/www/html

     ErrorLog ${APACHE_LOG_DIR}/error.log
     CustomLog ${APACHE_LOG_DIR}/access.log combined

     SSLEngine on

     SSLCertificateFile      "pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0105076;token=UserPIN%20%28SmartCard-HSM%29"

     #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

     <FilesMatch "\.(cgi|shtml|phtml|php)$">
                     SSLOptions +StdEnvVars
     </FilesMatch>
     <Directory /usr/lib/cgi-bin>
                     SSLOptions +StdEnvVars
     </Directory>

  </VirtualHost>
</IfModule>