Apache-2.4

Apache 未通過 PKCS#11 找到受 HSM 保護的私鑰

  • October 25, 2019

我已經在我的 Centos7 虛擬機上安裝了 Apache 和 mod_ssl。我正在嘗試使 TLS 使用受 HSM 通過 PKCS#11 保護的私鑰,但是當我嘗試啟動 Apache 時,它找不到我的私鑰(請參閱下面的錯誤)。我們的 PKCS#11 庫的日誌中也沒有寫入任何內容。

另一方面,如果我嘗試直接從命令行使用具有相同 PKCS#11 URI 的 OpenSSL,它能夠與 HSM 後端通信並辨識密鑰。PKCS#11 庫的日誌也會出現。

openssl rsautl -engine pkcs11 -keyform engine -inkey 'pkcs11:type=private?pin-value=121212;token=VendorPKCS11;id=%51' -sign -in myinputfile.txt -out myoutputfile.txt

對我來說,Apache 似乎出於某種原因沒有載入我們的 PKCS#11 庫,我不知道為什麼。我在Google找到了這個,但不是很詳細。

這是我設置的…

/etc/httpd/conf.d/ssl.conf:

(注意:apachecert.pem 是使用 HSM 上的私鑰自簽名的。)

Listen 443 https

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin

SSLCryptoDevice pkcs11

<VirtualHost _default_:443>
   DocumentRoot "/var/www/html"
   ServerName myserver:443

   ErrorLog logs/ssl_error_log
   TransferLog logs/ssl_access_log
   LogLevel warn

   SSLEngine on

   SSLProtocol all -SSLv2 -SSLv3

   SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

   SSLCertificateFile /etc/pki/tls/apachecert.pem
   SSLCertificateKeyFile "pkcs11:type=private?pin-value=121212;token=VendorPKCS11;id=%51"
</VirtualHost>

/etc/pki/tls/openssl.cnf:

openssl_conf = openssl_def
[openssl_def]
engines = engine_section
[engine_section]
pkcs11 = pkcs11_section
[pkcs11_section]
engine_id = pkcs11
dynamic_path = /usr/lib64/openssl/engines/libpkcs11.so
MODULE_PATH = /etc/pki/tls/libVendorPKCS11.so
init = 0

/etc/pki/tls/VendorPKCS11.properties:

log.folder.path=/etc/pki/tls/p11logs
log.level=5
delay.between.auto.recovery.attempts=300
authentication.mode=TICKET
portal.server.list=node1
token.label=VendorPKCS11
token.manufacturer.id=Vendor
token.model=HSM Portal Token
token.serial.number=1
token.max.pin.length=1024
token.min.pin.length=1
token.hardware.version=1.0
token.firmware.version=1.0
slot.description=Vendor HSM Portal PKCS11
slot.manufacturer.id=Vendor
slot.hardware.version=1.0
slot.firmware.version=1.0
info.cryptoki.interface.version=2.20
info.manufacturer.id=Vendor
info.library.description=HSM Portal based PKCS11 library
info.library.version=2.0
credentials.user.name=username
portal.node1.uri=backendserver:8999
portal.node1.certificate.path=/etc/pki/tls/rootcer.pem
portal.node1.concurrent.clients=2
timeout.connection=15000
timeout.command=60000
timeout.keep.alive=600000

我在嘗試啟動 Apache 時看到的錯誤:

Oct 22 08:55:25 myserver systemd[1]: Starting The Apache HTTP Server...
Oct 22 08:55:25 myserver httpd[11013]: AH00526: Syntax error on line 112 of /etc/httpd/conf.d/ssl.conf:
Oct 22 08:55:25 myserver httpd[11013]: SSLCertificateKeyFile: file '/etc/httpd/pkcs11:type=private?pin-value=121212;token=VendorPKCS11;id=%51' does not exist or is empty
Oct 22 08:55:25 myserver systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Oct 22 08:55:25 myserver kill[11015]: kill: cannot find process ""
Oct 22 08:55:25 myserver systemd[1]: httpd.service: control process exited, code=exited status=1
Oct 22 08:55:25 myserver systemd[1]: Failed to start The Apache HTTP Server.
Oct 22 08:55:25 myserver systemd[1]: Unit httpd.service entered failed state.
Oct 22 08:55:25 myserver systemd[1]: httpd.service failed.

有誰知道為什麼 Apache 無法找到供應商 PKCS#11 庫或至少沒有任何日誌顯示?我也覺得奇怪的是,在 Apache 的錯誤輸出中,在 PKCS#11 URI 前面添加了“/etc/httpd/”。

經過一番白髮後,我意識到 PKCS#11 URI 僅在 Apache 的開發分支(版本 2.5.1)中實現。它在 2.4 的最新穩定版本中不可用。

包含此功能的修訂版如下:https ://svn.apache.org/viewvc?view=revision&revision=1830819

所以現在我想要實現的目標似乎無法用 Apache 2.4 和 mod_ssl 實現。

由於 Apache 次要版本號中的奇數僅被視為 Alpha/Beta,看來我們需要等待 httpd 2.6 發布。我找不到任何有關這方面的資訊,所以現在我不會屏住呼吸。

我一直在研究將 Apache 與 PKCS#11 一起使用的替代方法是:

  • 使用 mod_nss 而不是 mod_ssl
  • 有一個 PKCS#11 模組,該模組能夠從假密鑰文件中獲取參數(讓 Apache 2.4 讀取 ssl 配置而不會出現問題)

引用自:https://serverfault.com/questions/988982