Настройка на TLS с Apache2

Hint

Същата концепция, както е описана тук, може да се използва за много приложения, използващи openssl като крипто-бекенд. Концепцията се свежда най-вече до следното: заместване на (секретен) ключов файл с PKCS#11 URL, който се позовава на ключ на защитен ключ (Nitrokey).

Подготовка

  • Уверете се, че версията на apache2 е поне 2.4.42 за правилна mod_ssl поддръжка

  • активиране на mod_ssl с помощта на a2enmod ssl, ако вече не е направено

  • Освен това е необходимо openssl и libengine-pkcs11-openssl виж PKCS#11 URL

Конфигуриране на Apache2 за използване на ключ за сигурност

По принцип единственото, което трябва да направите, е да замените SSLCertificateFile с правилния PKCS#11 URL адрес и да изтриете всички други препратки към ключове или сертификати. Например, SSLCertificateKeyFile вече не е необходимо.

Една примерна директива може да изглежда по следния начин:

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

Правилният PKCS#11 URL адрес може да бъде извлечен, както е документирано в PKCS#11 URL Generation

Не забравяйте да поставите директивата в конфигурация VirtualHost.

Предоставяне на ПИН код по време на стартирането на Apache2

При използване на описания по-рано метод Apache2 ще пита при всяко стартиране за User-PIN, като по този начин по същество се отказва от пакетното стартиране. Apache2 предоставя друга директива за предоставяне на ПИН по време на стартиране.

SSLPassPhraseDialog     "|/bin/echo 123456"

Apache2 очаква изпълним файл след |, който ще бъде изпълнен по време на стартиране и изходът му (очаква се завършващ нов ред) ще бъде използван като PIN. Очевидно е, че чрез този подход могат да се прилагат произволни сложни методи за извличане на ПИН. Въпреки че тук е избран тривиален пример, който просто echo ПИН по време на стартиране.

Освен това SSLPassPhraseDialog е глобална директива, затова трябва да бъде поставена в глобалния обхват на конфигурацията в Apache2.

Warning

Показаният пример не е сигурен механизъм за предаване на вашия ПИН код, тъй като той ще бъде записан в обикновен текст в конфигурацията ви.

Вижте Документацията на Apache2 mod_ssl за повече подробности относно тази функция.

Пълен пример за конфигурация на Apache2

Пълен фрагмент от конфигурацията на Apache2 (VirtualHost) може да изглежда така:

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