PKCS11 Windows 无效引擎 YubiHSM2



>又是我。 我正在使用YubiHSM2 HSM模块,我正在尝试将其设置为使用pkcs11引擎,这将允许我将OpenSSL与HSM一起使用。

我正在Windows上实现这一点,这给我带来了很多麻烦。 我已经安装了OpenSSL 32,64,OpenSC,YubiHSM2驱动程序以及libp11(使用MSYS2构建)。

我的OpenSSL.cnf的有趣部分看起来像这样:

openssl_conf = openssl_init
[openssl_init]
engines = engine_section
[engine_section]
pkcs11 = pkcs11_section
[pkcs11_section]
engine_id = pkcs11
dynamic_path = "C:WindowsSystem32opensc-pkcs11.dll"
MODULE_path = "C:UsersmyUserDesktopSecureTemialyubihsm2-sdkbinyubihsm_pkcs11.dll"
PIN = "0001password"
init = 0

当我尝试时:

C:OpenSSL-Win64binopenssl.exe req -new -x509 -days 365 -sha256 -config C:UsersmyUserDesktopSecureTemialopenssl.cnf -engine pkcs11 -keyform engine -key slot_0-label_my_key -out cert.pem

我收到以下内容:

C:OpenSSL-Win64binopenssl.exe : invalid engine "pkcs11"
In Zeile:1 Zeichen:2
+  C:OpenSSL-Win64binopenssl.exe req -new -x509 -days 365 -sha256 -c ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (invalid engine "pkcs11":String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
16056:error:25078067:DSO support routines:win32_load:could not load the shared 
library:cryptodsodso_win32.c:106:filename(C:Program FilesOpenSSLlibengines-1_1pkcs11.dll)
16056:error:25070067:DSO support routines:DSO_load:could not load the shared library:cryptodsodso_lib.c:161:
16056:error:260B6084:engine routines:dynamic_load:dso not found:cryptoengineeng_dyn.c:414:
16056:error:2606A074:engine routines:ENGINE_by_id:no such engine:cryptoengineeng_list.c:339:id=pkcs11
16056:error:25078067:DSO support routines:win32_load:could not load the shared 
library:cryptodsodso_win32.c:106:filename(pkcs11.dll)
16056:error:25070067:DSO support routines:DSO_load:could not load the shared library:cryptodsodso_lib.c:161:
16056:error:260B6084:engine routines:dynamic_load:dso not found:cryptoengineeng_dyn.c:414:
Error configuring OpenSSL modules
16056:error:25078067:DSO support routines:win32_load:could not load the shared 
library:cryptodsodso_win32.c:106:filename(C:WindowsSystem32opensc-pkcs11.dll)
16056:error:25070067:DSO support routines:DSO_load:could not load the shared library:cryptodsodso_lib.c:161:
16056:error:260B6084:engine routines:dynamic_load:dso not found:cryptoengineeng_dyn.c:414:
16056:error:260BC066:engine routines:int_engine_configure:engine configuration 
error:cryptoengineeng_cnf.c:141:section=pkcs11_section, name=dynamic_path, value=C:WindowsSystem32opensc-pkcs11.dll
16056:error:0E07606D:configuration file routines:module_run:module initialization 
error:cryptoconfconf_mod.c:173:module=engines, value=engine_section, retcode=-1   

我已经检查了 dll 是否被锁定并以管理员身份运行等。 如果您有任何线索导致这里的问题,请告诉我!

谢谢!

这个问题是我对类似主题进行一些研究时出现在搜索结果中的第一个问题之一。由于它还没有答案,我将概述我的解决方案的结果:

要将 libp11 的 PKCS#11 引擎与 OpenSSL 一起使用,必须将其编译为动态引擎,该引擎与您正在使用的 OpenSSL 版本静态链接。由于您使用的是 Shining Light Productions 中的二进制文件(根据您在问题中提到的安装目录,这是一个很好的猜测),使用从第三方资源获取的 MSYS2 版本可能不起作用,使用 OpenSC 项目的 Windows 安装程序附带的 PKCS#11 库也不起作用。

幸运的是,Shining Light Productions的OpenSSL版本附带了所有必需的库,因此您可以轻松地自己编译libp11,例如通过使用NMAKE(点击链接查看如何获取它以及如何正确设置命令行以供使用):

  1. 下载满足您要求的 OpenSSL 二进制文件(x86 或 x64),并将它们安装到建议的标准目标(例如,C:OpenSSL-Win32C:OpenSSL-Win64)。 - libp11 的生成文件需要这些文件夹进行绑定。
  2. 下载并提取或克隆 libp11 项目的源代码。
  3. 打开设置了 NMAKE 环境变量的 Windows 命令行,并更改为以前下载的 libp11 文件的位置。
  4. 在构建 64 位版本的 OpenSSL 时,必须相应地设置BUILD_FOR环境变量。跑

    set BUILD_FOR=WIN64
    

    在您的命令行上。

  5. 现在通过运行编译库

    NMAKE /F Makefile.mak
    
  6. 如果一切顺利,libp11 的src文件夹中有两个新库:libp11.dllpkcs11.dll。后者是与您的OpenSSL一起使用的PKCS#11引擎。例如,将其复制到Windows库文件夹(32位版本为System32,x64版本为SysWOW64)。

  7. 相应地调整您的openssl.cnf文件。复制

    openssl_conf = openssl_init
    

    到文件的开头,其余部分到其结尾:

    [openssl_init]
    engines = engine_section
    [engine_section]
    pkcs11 = pkcs11_section
    [pkcs11_section]
    dynamic_path = "C:\Windows\SysWOW64\pkcs11.dll"
    module_path = "C:\Users\myUser\Desktop\SecureTemial\yubihsm2-sdk\bin\yubihsm_pkcs11.dll"
    PIN = "0001password"
    

最后要说几点:

  1. 确保改编后的openssl.cnf文件确实被OpenSSL拾取。OpenSSL 安装附带了几个示例文件。默认情况下,对于 x64 版本,上述二进制文件的配置文件位置C:Program FilesCommon FilesSSLopenssl.cnf,对于 x86 版本,C:Program Files (x86)Common FilesSSLopenssl.cnf。但是系统上的其他OpenSSL安装(例如,来自OpenVPN,MingW,MSYS2等捆绑的OpenSSL的安装)可能会干扰设置文件的位置。您可以通过相应地设置OPENSSL_CONF环境变量来确保使用正确的设置文件。
  2. 对 Windows 路径使用双引号时,请确保使用\而不是正确转义反斜杠。
  3. 您可以安全地省略engine_idinitopenssl.cnf[pkcs11_section]的一部分。
  4. 虽然libp11的动态PKCS#11引擎需要针对与OpenSSL相同的架构(x86或x64)和库进行编译,但模块库可能需要作为32位版本(即使运行OpenSSL的64位版本)。 - 至少这是我们系统场景中发生的事情(我们使用金雅拓安全网电子令牌, 所以安全网身份验证客户端附带的阿拉丁模块库)。

最新更新