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