2016-08-30 129 views
0

我有一個python程序,它使用PyKCS11,一個python包裝的pkcs11接口。我可以使用存儲在HSM上且由PyKCS11訪問的ECC私鑰(機制CKM_ECDSA)簽署數據。從PyKCS11驗證ECDSA簽名

我現在想要的是通過相應的公鑰驗證openssl的ECDSA簽名。該公鑰包含在由HSM中的私鑰創建的x509(NewCert.pem)中。

我測試了很多方法來正確驗證簽名,但我沒有成功。

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

文件「簽名」包含base64編碼簽名。文件'文件'是明文數據。

謝謝

+0

Meta:這不是一個編程問題,可能最適合超級用戶。但是:只指定'-sha1'而不指定'-ecdsa-with-sha1'(ecdsa從pubkey中推斷出來)。 –

回答

1

最後,我找到了解決方案,我的問題。

I) PyKCS11的簽名輸出是ECDSA簽名的r和s值的串聯。它沒有以ASN1格式格式化。這是第一個爲什麼使用openssl進行驗證是不可能的問題,因爲後者需要這種格式。

II) 因此,我寫了一個函數,它將PyKCS11輸出格式化爲符合ASN1並將二進制簽名輸出保存到文件中。

III) 爲了使用散列函數,您首先必須散列數據或要簽名的文件。這可以在Python中使用hashlib的命令digest()完成。在此之後,您將這個二進制數據的散列作爲PyKCS11的輸入並創建簽名。

IV) 散列ECDSA簽名的驗證可以用下面的命令中的OpenSSL來完成:

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

確保PUBKEY是從相應的X509證書(而不是X509的EC公鑰本身)。 file.sign意思是指包含表示原始數據的二進制散列的ECDSA簽名的二進制文件(參見步驟III)。

希望這可以幫助別人。