用Apache2设置TLS#
提示
这里描述的相同概念可以用于许多使用openssl作为加密后端的应用。这个概念主要归结为:用PKCS#11 URL替代(秘密)密钥文件,引用安全令牌(Nitrokey)上的一个密钥。
准备工作#
确保`apache2`的版本至少是2.4.42,以获得正确的``mod_ssl``支持。
激活``mod_ssl``使用``a2enmod ssl``,如果尚未完成。
另外还需要``openssl``和``libengine-pkcs11-openssl``见:doc:PKCS#11 URL<pkcs11-url>
配置Apache2以使用安全密钥#
基本上唯一要做的是用适当的PKCS#11 URL替换``SSLCertificateFile`,并删除任何其他对钥匙或证书的引用。例如,``SSLCertificateKeyFile``就不再需要了。
一个指令的例子可能是这样的。
SSLCertificateFile "pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0123123;token=UserPIN%20%28SmartCard-HSM%29;id%01"
适当的PKCS#11 URL可以按照:doc:`PKCS#11 URL生成<pkcs11-url>`中的记载提取。
请确保将该指令放在 “虚拟主机 “的配置中。
在Apache2启动时提供PIN码#
使用前面描述的方法,Apache2会在每次启动时询问用户PIN,因此基本上拒绝了批量启动。Apache2提供了另一个指令,在启动时提供PIN。
SSLPassPhraseDialog "|/bin/echo 123456"
Apache2期望在``|``之后有一个可执行文件,该文件将在启动时被执行,它的输出(尾部换行被期望)将被用作PIN。显然,任意复杂的PIN检索方法都可以用这种方法来实现。虽然这里选择了一个微不足道的例子,只是在启动过程中``echo``的PIN。
此外``SSLPassPhraseDialog``是一个全局指令,因此必须放在Apache2的全局配置范围中。
警告
这个例子并不是传递PIN码的安全机制,因为它将以明文形式写入你的配置中。
关于这个功能的更多细节,请看`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>