假设:以下是在 Cygwin 上使用 OpenSSL 0.9.8e 完成的
对于“不支持的证书用途”,直接签名者可能没有 S/MIME 用途。
来自OpenSSL 文档:
-目的
证书的预期用途。如果没有此选项,将不会进行链验证。
$ openssl x509 -用途 -in goodcert.pem -noout
证书用途:
SSL 客户端:否
SSL 客户端 CA:否
SSL 服务器:否
SSL 服务器 CA : 否
网景 SSL 服务器:否
网景 SSL 服务器 CA:否
S/MIME 签名:否
S/MIME 签名 CA:否
S/MIME 加密:否
S/MIME 加密 CA : 否
CRL 签名:否
CRL 签署 CA:否
任何目的:是的
任何目的 CA : 是
参考this,我添加了开关“- purpose any”。然后我不再看到“不支持的证书用途”,但仍然遇到与您相同的摘要和签名失败。
1900:错误:21071065:PKCS7 例程:PKCS7_signatureVerify:摘要失败:pk7_doit.c:948:
1900:错误:21075069:PKCS7 例程:PKCS7_verify:签名失败:pk7_smime.c:312:
有了这个提示和大量研究(#1,#2),结果证明 -content 的输入“modified_exe”是错误的。它应该是PKCS #7 SignedData的 Sequence ContentInfo中的内容字段,不包括其 DER 标记和长度字节。有关SignedData的声明,
请参阅Authenticode_PE.docx。
(只是我认为不合适的太多细节包括!)
检查下面的清晰度:
openssl asn1parse -inform der -in signature.der > signature.txt
head signature.txt -n30
0:d=0 hl=4 l=5464 cons: SEQUENCE
4:d=1 hl=2 l= 9 prim: OBJECT :pkcs7-signedData
15:d=1 hl=4 l=5449 cons: cont [ 0 ]
19:d=2 hl=4 l=5445 cons: SEQUENCE //SignedData
23:d=3 hl=2 l= 1 prim: INTEGER :01 //Version
26:d=3 hl=2 l= 11 cons: SET //DigestAlgorithmIdentifiers
28:d=4 hl=2 l= 9 cons: SEQUENCE
30:d=5 hl=2 l= 5 prim: OBJECT :sha1
37:d=5 hl=2 l= 0 prim: NULL
39:d=3 hl=2 l= 104 cons: SEQUENCE //ContentInfo
41:d=4 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.2.1.4 //ContentType
53:d=4 hl=2 l= 90 cons: cont [ 0 ]
55:d=5 hl=2 l= 88 cons: SEQUENCE //SpcIndirectDataContent (exclude this tag and length bytes)
57:d=6 hl=2 l= 51 cons: SEQUENCE //SpcAttributeTypeAndOptionalValue
59:d=7 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.2.1.15 //ObjectID
71:d=7 hl=2 l= 37 cons: SEQUENCE
73:d=8 hl=2 l= 1 prim: BIT STRING
76:d=8 hl=2 l= 32 cons: cont [ 0 ]
78:d=9 hl=2 l= 30 cons: cont [ 2 ]
80:d=10 hl=2 l= 28 prim: cont [ 0 ]
110:d=6 hl=2 l= 33 cons: SEQUENCE //DigestInfo
112:d=7 hl=2 l= 9 cons: SEQUENCE //AlgorithmIdentifier
114:d=8 hl=2 l= 5 prim: OBJECT :sha1 //ObjectID
121:d=8 hl=2 l= 0 prim: NULL
123:d=7 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:<hash of modified_exe> //digest OCTETSTRING
145:d=3 hl=4 l=4774 cons: cont [ 0 ]
149:d=4 hl=4 l=1332 cons: SEQUENCE
153:d=5 hl=4 l= 796 cons: SEQUENCE
157:d=6 hl=2 l= 3 cons: cont [ 0 ]
159:d=7 hl=2 l= 1 prim: INTEGER :02
从偏移量57到144的字节流是 -content 的正确输入!
确切的偏移量取决于您的文件。
作为粗略的指导,“1.3.6.1.4.1.311.2.1.15”之前的 2 行是“SpcIndirectDataContent”,在这一行上请注意 55+2+88-1= 144。下一行从57开始。
最终命令:
openssl smime -verify -inform DER -in signature.der -binary -content signedData -CAfile myCA.crt - purpose any -out tmp