TLS-inställning med Apache2#

(Nitrokey HSM 2 - macOS)

Råd

Samma koncept som beskrivs här kan användas för många tillämpningar som använder openssl som kryptobackend. Konceptet går i huvudsak ut på att ersätta en (hemlig) nyckelfil med en PKCS#11-URL som hänvisar till en nyckel på en säkerhetstoken (Nitrokey).

Förberedelse#

  • Se till att apache2 är minst 2.4.42 för att få korrekt mod_ssl-stöd.

  • Aktivera mod_ssl med hjälp av a2enmod ssl, om det inte redan är gjort.

  • Dessutom behövs openssl och libengine-pkcs11-openssl se PKCS#11 URL

Konfigurera Apache2 för att använda en säkerhetsnyckel#

Det enda du behöver göra är att ersätta SSLCertificateFile med den korrekta PKCS#11-URL:n och ta bort alla andra referenser till nycklar eller certifikat. SSLCertificateKeyFile behövs inte längre.

Ett exempel på ett direktiv kan se ut så här:

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

Den korrekta PKCS#11-URL:n kan extraheras enligt dokumentationen i PKCS#11 URL Generation

Se till att du placerar direktivet i en VirtualHost-konfiguration.

Ange PIN-kod vid start av Apache2#

Med hjälp av den tidigare beskrivna metoden kommer Apache2 vid varje start att be om användar-PIN:et, vilket i princip innebär att batch-start avbryts. Apache2 tillhandahåller ett annat direktiv för att ange PIN-koden vid uppstart.

SSLPassPhraseDialog     "|/bin/echo 123456"

Apache2 förväntar sig en körbar fil efter |, som kommer att exekveras under uppstarten och dess utdata (avslutande nyrad förväntas) kommer att användas som PIN. Det är uppenbart att man med detta tillvägagångssätt kan genomföra godtyckligt komplexa metoder för att hämta PIN-koder. Här har dock ett trivialt exempel valts för att bara echo PIN-koden under uppstarten.

Vidare är SSLPassPhraseDialog ett globalt direktiv och måste därför placeras i det globala konfigurationsområdet i Apache2.

Varning

Det här exemplet är inte en säker mekanism för att överföra din PIN-kod, eftersom den kommer att skrivas i klartext i din konfiguration.

Se Apache2 mod_ssl documentation för mer information om denna funktion.

Exempel på fullständig Apache2-konfiguration#

Ett komplett konfigurationsutdrag för Apache2 (VirtualHost) kan se ut så här:

<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>