从PyKCS11验证ECDSA签名

时间:2016-08-30 17:22:44

标签: pkcs#11 pyopenssl ecdsa

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

我现在想要的是用openssl通过相应的公钥验证ECDSA签名。此公钥包含在x509(NewCert.pem)中,该x509是使用HSM中的私钥创建的。

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

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

文件'signature'包含base64编码的签名。并且文件'文件'是普通数据。

谢谢

1 个答案:

答案 0 :(得分:1)

最后,我找到了解决问题的方法。

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

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

III) 要使用散列函数,首先必须散列数据或要签名的文件。这可以使用hashlib的命令 digest()在Python中完成。在此之后,您将数据的二进制哈希作为输入提供给PyKCS11并创建签名。

IV) 可以使用openssl中的以下命令验证散列的ECDSA签名:

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

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

希望这有助于其他人。