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 证书,因此删除它们没有问题。