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

Подсказка

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

Подготовка

  • убедитесь, что версия apache2 не ниже 2.4.42 для правильной поддержки mod_ssl.

  • активируйте mod_ssl, используя a2enmod ssl, если это еще не сделано

  • Дополнительно openssl необходимо и libengine-pkcs11-openssl см. PKCS#11 URL.

Настройка Apache2 на использование ключа безопасности

По сути, единственное, что нужно сделать, это заменить SSLCertificateFile на правильный URL PKCS#11 и удалить все остальные ссылки на ключи или сертификаты. Например, SSLCertificateKeyFile больше не нужен.

Пример директивы может выглядеть следующим образом:

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

Правильный URL PKCS#11 может быть извлечен, как описано в PKCS#11 URL Generation.

Обязательно поместите директиву внутри конфигурации VirtualHost.

Предоставление PIN-кода во время запуска Apache2

При использовании ранее описанного метода Apache2 будет запрашивать PIN-код пользователя при каждом запуске, тем самым фактически отказываясь от пакетного запуска. Apache2 предоставляет другую директиву для предоставления PIN-кода при запуске.

SSLPassPhraseDialog     "|/bin/echo 123456"

После | Apache2 ожидает исполняемый файл, который будет выполнен во время запуска и его’вывод (ожидается новая строка) будет использован в качестве PIN. Очевидно, что с помощью этого подхода можно реализовать произвольные сложные методы извлечения PIN. Хотя здесь был выбран тривиальный пример, чтобы просто echo получить PIN во время запуска.

Далее SSLPassPhraseDialog является глобальной директивой, поэтому должна быть помещена в область глобальной конфигурации в Apache2.

Предупреждение

Этот пример не является безопасным механизмом передачи PIN-кода, поскольку он будет записан в открытом виде внутри вашей конфигурации.

Более подробную информацию об этой функции смотрите в документации по mod_ssl для Apache2.

Пример полной конфигурации 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>