我有一个使用PyKCS11的python程序,它是用于pkcs11接口的python包装器。我可以用存储在高速机床上的ECC私钥(CKM_ECDSA机制)对数据进行签名,该私钥由PyKCS11访问。
我现在想要的是用openssl通过相应的公钥验证ECDSA签名。这个公钥包含在一个x509 (NewCert.pem)中,它是由HSM中的私钥创建的。
我测试了许多正确验证签名的方法,但没有成功。
openssl dgst -ecdsa-with-SHA1 -verify <(openssl x509 -noout -pubkey -in NewCert.pem) -signature <(cat sign | base64 -d) file文件“签名”包含base64编码的签名。和文件‘文件’的普通数据。
谢谢
发布于 2016-09-06 14:32:22
最后,我找到了解决问题的办法。
(1) PyKCS11的签名输出是ECDSA签名的r值和s值的级联。它不是用ASN1样式格式化的。这是不可能使用openssl进行验证的第一个问题,因为后者需要这种格式。
因此,我编写了一个函数,将PyKCS11输出格式化为ASN1一致性,并将二进制签名输出保存到文件中。
(3)为了使用散列函数,首先必须散列要签名的数据或文件。这可以用hashlib的命令摘要()在Python中完成。在此之后,您将数据的二进制哈希作为PyKCS11的输入并创建签名。
(4)可以使用openssl中的以下命令来验证哈希ECDSA签名:
openssl dgst -sha384 -verify pubkey -signature file.sign file确保公共密钥是来自相应的x509证书(而不是x509本身)的EC公钥。file.sign意味着是包含ECDSA签名的二进制文件,该签名表示原始数据的二进制哈希(参见步骤三)。
希望这对其他人有帮助。
https://stackoverflow.com/questions/39233560
复制相似问题