ENGINE_load_private_key 和 PKCS#11 的问题
Problem with ENGINE_load_private_key and PKCS#11
由于使用 PKCS#11 令牌进行签名 (Authenticode),并且由于供应商 (SafeNet) 的驱动程序支持非常差,我们正在 Linux 上签署 Windows 代码。
所有这些都可以在多个构建服务器上使用我们的所有令牌正常工作。但是,我有一个令牌失败,具体取决于所使用的机制。从 Java 开始,使用 Jsign 和 SunPKCS11 提供程序,此令牌一切正常。
但是,从 osslsigncode,使用此令牌签名失败:
Unable to enumerate certificates
PKCS11_get_private_key returned NULL
Failed to load private key 9df65894eb084ba3140555614123992:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:eng_pkey.c:124:
Failed
工作令牌和非工作令牌的区别在于,非工作令牌不仅包括证书,还包括其信任链:
# pkcs11-tool --module libeToken.so --list-objects
Using slot 0 with a present token (0x0)
Certificate Object, type = X.509 cert
label: te-69f298db-2f32-4a94-82ea-3e11829b26cd
ID: 9df65894eb084ba3
Certificate Object, type = X.509 cert
label:
Certificate Object, type = X.509 cert
label:
使用 p11tool,上面的两个看起来空的证书显示为:
Type: X.509 Certificate
Label:
Flags: CKA_CERTIFICATE_CATEGORY=CA;
ID:
我的其他令牌都可以正常工作,但不包括这些 CA 证书。这个令牌是最近创建的,所以可能是令牌固件与我的其他固件不同,或者自从我创建了其他可用令牌后令牌安装过程发生了变化。所有证书都相同,工作和非工作。
我已经确认(通过 gdb)正确的密钥 ID 被传递到 ENGINE_load_private_key。
在这种情况下,我不确定谁拥有 ENGINE API - 这是令牌驱动程序问题吗? (SafeNet) 是 OpenSC 的问题吗?等等。找到其他一些以相同方式使用 API 的工具会很有帮助,这样我就可以确认问题是否出在 osslsigncode(不受积极支持)或此中的较低层之一纸牌塔。
P.S。我使用了 PKCS#11 Spy,它显示了链中所有证书的枚举,因此它找到了密钥对(通过 ID),但随后失败了——PKCS#11 Spy 中没有错误——全部 CKR_OK。
P.P.S。为了解决这个令牌是否也有私钥的问题...
Using slot 0 with a present token (0x0)
Logging in to "Code Signing Token 11".
Please enter User PIN:
Private Key Object; RSA
label:
ID: 9df65894eb084ba3
Usage: decrypt, sign, unwrap
Certificate Object, type = X.509 cert
label: te-69f298db-2f32-4a94-82ea-3e11829b26cd
ID: 9df65894eb084ba3
Certificate Object, type = X.509 cert
label:
Certificate Object, type = X.509 cert
label:
您似乎没有登录令牌。在 pkcs11-tool 中,如果要检索私有对象,请使用 --login --pin <your-pin-code>
。
需要注意的是,签名过程需要一个合适的私钥(不是证书)。
解决方案,至少目前,似乎只是从令牌中删除 CA 证书(通过 Windows 上的 SAC 工具)。完成后,osslsigncode(通过 PKCS#11 堆栈)可以毫无问题地找到令牌。签名不需要 CA 证书,因此删除它们没有问题。
由于使用 PKCS#11 令牌进行签名 (Authenticode),并且由于供应商 (SafeNet) 的驱动程序支持非常差,我们正在 Linux 上签署 Windows 代码。
所有这些都可以在多个构建服务器上使用我们的所有令牌正常工作。但是,我有一个令牌失败,具体取决于所使用的机制。从 Java 开始,使用 Jsign 和 SunPKCS11 提供程序,此令牌一切正常。
但是,从 osslsigncode,使用此令牌签名失败:
Unable to enumerate certificates
PKCS11_get_private_key returned NULL
Failed to load private key 9df65894eb084ba3140555614123992:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:eng_pkey.c:124:
Failed
工作令牌和非工作令牌的区别在于,非工作令牌不仅包括证书,还包括其信任链:
# pkcs11-tool --module libeToken.so --list-objects
Using slot 0 with a present token (0x0)
Certificate Object, type = X.509 cert
label: te-69f298db-2f32-4a94-82ea-3e11829b26cd
ID: 9df65894eb084ba3
Certificate Object, type = X.509 cert
label:
Certificate Object, type = X.509 cert
label:
使用 p11tool,上面的两个看起来空的证书显示为:
Type: X.509 Certificate
Label:
Flags: CKA_CERTIFICATE_CATEGORY=CA;
ID:
我的其他令牌都可以正常工作,但不包括这些 CA 证书。这个令牌是最近创建的,所以可能是令牌固件与我的其他固件不同,或者自从我创建了其他可用令牌后令牌安装过程发生了变化。所有证书都相同,工作和非工作。
我已经确认(通过 gdb)正确的密钥 ID 被传递到 ENGINE_load_private_key。
在这种情况下,我不确定谁拥有 ENGINE API - 这是令牌驱动程序问题吗? (SafeNet) 是 OpenSC 的问题吗?等等。找到其他一些以相同方式使用 API 的工具会很有帮助,这样我就可以确认问题是否出在 osslsigncode(不受积极支持)或此中的较低层之一纸牌塔。
P.S。我使用了 PKCS#11 Spy,它显示了链中所有证书的枚举,因此它找到了密钥对(通过 ID),但随后失败了——PKCS#11 Spy 中没有错误——全部 CKR_OK。
P.P.S。为了解决这个令牌是否也有私钥的问题...
Using slot 0 with a present token (0x0)
Logging in to "Code Signing Token 11".
Please enter User PIN:
Private Key Object; RSA
label:
ID: 9df65894eb084ba3
Usage: decrypt, sign, unwrap
Certificate Object, type = X.509 cert
label: te-69f298db-2f32-4a94-82ea-3e11829b26cd
ID: 9df65894eb084ba3
Certificate Object, type = X.509 cert
label:
Certificate Object, type = X.509 cert
label:
您似乎没有登录令牌。在 pkcs11-tool 中,如果要检索私有对象,请使用 --login --pin <your-pin-code>
。
需要注意的是,签名过程需要一个合适的私钥(不是证书)。
解决方案,至少目前,似乎只是从令牌中删除 CA 证书(通过 Windows 上的 SAC 工具)。完成后,osslsigncode(通过 PKCS#11 堆栈)可以毫无问题地找到令牌。签名不需要 CA 证书,因此删除它们没有问题。