用Apache2设置TLS

Compatible Nitrokeys

3A/C/Mini

Passkey

HSM 2

Pro 2

FIDO2

Storage 2

Start

U2F

inactive

inactive

active

inactive

inactive

inactive

inactive

inactive

提示

The very same concept as descriped here can be used for many applications using openssl as crypto-backend. The concept mostly boils down to: replace (secret) key-file with PKCS#11 URL referencing a key on a security token (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>