Настройка 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>