从 PyKCS11 验证 ECDSA 签名

Verify ECDSA signature from PyKCS11

我有一个使用 PyKCS11 的 python 程序,它是 pkcs11 接口的 python 包装器。我可以使用存储在 HSM 上并由 PyKCS11 访问的 ECC 私钥(机制 CKM_ECDSA)对数据进行签名。

我现在想要的是用对应的public密钥用openssl验证ECDSA签名。此 public 密钥包含在 x509 (NewCert.pem) 中,它是根据 HSM 中的私钥创建的。

我测试了很多方法来正确验证签名,但我没有成功。

openssl dgst -ecdsa-with-SHA1 -verify <(openssl x509 -noout -pubkey -in NewCert.pem) -signature <(cat sign | base64 -d) file

文件'signature'包含base64编码的签名。文件 'file' 是纯数据。

谢谢

我终于找到了解决问题的方法。

我) PyKCS11 的签名输出是 ECDSA 签名的 r 和 s 值的串联。它不是以 ASN1 样式格式化的。这是第一个无法使用openssl验证的问题,因为后者需要这种格式。

二) 所以我写了一个函数,将 PyKCS11 输出格式化为 ASN1 一致性并将二进制签名输出保存到文件中。

三) 为了使用哈希函数,您首先必须对要签名的数据或文件进行哈希处理。这可以在 Python 中使用 hashlib 的命令 digest() 来完成。在此之后,您将数据的 binary 散列作为 PyKCS11 的输入并创建签名。

四) 可以在 openssl 中使用以下命令来验证散列 ECDSA 签名:

openssl dgst -sha384 -verify pubkey -signature file.sign file

确保 pubkey 是来自相应 x509 证书(不是 x509 本身)的 EC public 密钥。而file.sign表示是包含ECDSA签名的二进制文件,表示原始数据的二进制哈希(见步骤III)。

希望这对其他人有所帮助。