当前位置: 首页 > 知识库问答 >
问题:

PKCS#7签名可以用OpenSSL验证,但不能用M2Crypto验证

戚奇略
2023-03-14

我有一个签名的PKCS#7结构data-signed.pem:

$ openssl smime -sign -binary -in data.txt -inkey key.pem -outform pem -out p7.pem -signer cert.pem
$ openssl smime -verify -CAfile cert.pem -content data.txt -in p7.pem -inform pem
[...]
Verification successful
$ python
>>> from M2Crypto import SMIME, X509, BIO
>>> sm_obj = SMIME.SMIME()
# The certificate is self-signed, so I add it to both
# trusted CA store and certificate stack:
>>> x509 = X509.load_cert('cert.pem')
>>> sk = X509.X509_Stack()
>>> sk.push(x509)
>>> sm_obj.set_x509_stack(sk)
>>> st = X509.X509_Store()
>>> st.load_info('cert.pem')
>>> sm_obj.set_x509_store(st)
# Now the actual verification:
>>> p7 = SMIME.load_pkcs7('p7.pem')
>>> data_bio = BIO.MemoryBuffer('data.txt')
>>> sm_obj.verify(p7, data_bio)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/M2Crypto-0.22.3-py2.7-linux-i686.egg/M2Crypto/SMIME.py", line 217, in verify
    blob = m2.pkcs7_verify1(p7, self.x509_stack._ptr(), self.x509_store._ptr(), data_bio._ptr(), flags)
M2Crypto.SMIME.PKCS7_Error: digest failure
$ openssl smime -sign -nodetach -binary -in data.txt -inkey key.pem -outform pem -out data-nodetach-signed.pem -signer cert.pem
$ python
[...]
>>> p7 = SMIME.load_pkcs7('data-nodetach-signed.pem')
>>> content = sm_obj.verify(p7)
>>>

共有1个答案

束雅达
2023-03-14

我在使用M2Crypto时犯了一个愚蠢的错误:

>>> data_bio = BIO.MemoryBuffer('data.txt')

当然,这不会读取文件'data.txt',而是读取字符串'data.txt',这不会验证。正确的行是

>>> data_bio = BIO.openfile('data.txt')
 类似资料:
  • 我试图实现PDFS的签名验证。这是一个很大的主题,所以我一步一步地进行,首先,我试图在我自己签名的PDF中实际返回一个正值,使用当前Acrobat的所有默认值--对于摘要,应该是SHA256和PKCS7分离签名。因此,我破解了openssl,通过读取PDF中给出的字节范围并调用函数,我得到了一个哈希值来进行比较。因此,现在我需要读取证书数据等,并使用函数。这个看起来就是我想要的: 如文档中所示。除

  • 我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到

  • 我正在研究ECDSA-WITH-SHA256的静脉签名。我的代码库来自openssl v1。0.1h,可以使用openssl命令行运行。但我的代码在执行以下代码时返回错误: PKCS7_dataInit代码如下: PKCS7_bio_添加_摘要返回错误,因此验证失败。 我像下面的命令行工具一样构造完全相同的命令行参数:[openssl smime]-verify-inform DER-in sig

  • 我想验证C中的签名,这是我在Java中签名的随机签名。 以下是我用于签名的Java代码: 现在我想用C验证签名,我需要C代码等于以下Java代码: 到目前为止,我所尝试的: 此方法返回0,但我确信随机是用正确的键签名的,并且该方法需要返回1...我想我的验证用的C代码有问题。也许你们中的一个知道如何做对。 --解决--

  • 我尝试制作一个Perl-Script来验证SMIME消息"手动"。我真的试了很多,但没有用。 大多数情况下,验证会放置“签名长于密钥”或只是给出错误的返回。 如果我在控制台用OpenSSL做这件事,它就像一个魅力。 它生成并验证msg.txt 我把它改短了。 现在我尝试用非常简单的Perl来展示它。我简化了MIME处理,只使用msg.txt中的内联值。 我跳过了剩下的。它相当于msg.txt中的签