Konfiguracja TLS w Apache2

Podpowiedź

Ta sama koncepcja jak opisana tutaj może być użyta w wielu aplikacjach używających openssl jako crypto-backend. Koncepcja sprowadza się głównie do: zastąpienia (tajnego) pliku klucza adresem URL PKCS#11 odwołującym się do klucza na tokenie bezpieczeństwa (Nitrokey)

Przygotowanie

  • upewnij się, że wersja apache2 jest co najmniej 2.4.42 dla poprawnego mod_ssl wsparcia

  • activate mod_ssl using a2enmod ssl, if not already done

  • dodatkowo openssl jest potrzebny i libengine-pkcs11-openssl patrz PKCS#11 URL.

Konfiguracja Apache2 do użycia klucza bezpieczeństwa

W zasadzie jedyną rzeczą, którą należy zrobić jest zastąpienie SSLCertificateFile właściwym adresem URL PKCS#11 i usunięcie wszelkich innych odniesień do kluczy lub certyfikatów. Na przykład, SSLCertificateKeyFile nie jest już potrzebny.

Przykładowa dyrektywa może wyglądać następująco:

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

Właściwy adres URL PKCS#11 może być wyodrębniony jak udokumentowano w PKCS#11 URL Generation.

Upewnij się, że dyrektywa jest umieszczona wewnątrz konfiguracji VirtualHost.

Podaj PIN podczas uruchamiania Apache2

Używając poprzednio opisanej metody, Apache2 będzie pytał przy każdym starcie o User-PIN, co w zasadzie uniemożliwi start wsadowy. Apache2 udostępnia inną dyrektywę, aby podać PIN podczas startu.

SSLPassPhraseDialog     "|/bin/echo 123456"

Apache2 oczekuje pliku wykonywalnego po |, który zostanie wykonany podczas startu i jego wyjście (oczekiwana jest końcowa nowa linia) zostanie użyte jako PIN. Oczywiście, dowolnie złożone metody pobierania PINu mogą być zaimplementowane przy użyciu tego podejścia. Chociaż tutaj został wybrany trywialny przykład, aby po prostu echo uzyskać PIN podczas uruchamiania.

Dalej SSLPassPhraseDialog jest dyrektywą globalną, a więc musi być umieszczona w globalnym zakresie konfiguracji w Apache2.

Ostrzeżenie

Ten pokazany przykład nie jest bezpiecznym mechanizmem przekazywania kodu PIN, ponieważ będzie on zapisany w postaci jawnego tekstu wewnątrz twojej konfiguracji

Zobacz dokumentację Apache2 mod_ssl documentation aby uzyskać więcej szczegółów na temat tej funkcji.

Kompletny przykład konfiguracji Apache2

Kompletny wycinek konfiguracji Apache2 (VirtualHost) może wyglądać tak:

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