Openssl 如何查看pkcs#7中签名的属性?

Openssl 如何查看pkcs#7中签名的属性?,openssl,sign,pkcs#7,Openssl,Sign,Pkcs#7,我有一个pkcs#7文件,其中包含签名数据。它成功地验证了: $ openssl smime -verify -in data.p7s -CAfile root-certificate.pem Verification successful Signed data 但当我提取签名部分时,我看不出它实际上与签名部分相同。我指的是以下步骤: $ openssl asn1parse -in data.p7s ... 35:d=4 hl=2 l= 9 prim: OBJECT

我有一个pkcs#7文件,其中包含签名数据。它成功地验证了:

$ openssl smime -verify -in data.p7s -CAfile root-certificate.pem 
Verification successful
Signed data
但当我提取签名部分时,我看不出它实际上与签名部分相同。我指的是以下步骤:

$ openssl asn1parse -in data.p7s
...
   35:d=4  hl=2 l=   9 prim: OBJECT            :pkcs7-data
   46:d=4  hl=2 l=inf  cons: cont [ 0 ]        
   48:d=5  hl=2 l=inf  cons: OCTET STRING      
   50:d=6  hl=2 l=   5 prim: OCTET STRING      :(my data is here in plaintext)
...
(then the signed block starts:)
 2861:d=6  hl=2 l=   9 prim: OBJECT            :rsaEncryption
 2872:d=6  hl=2 l=   0 prim: NULL              
 2874:d=5  hl=4 l= 256 prim: OCTET STRING      [HEX DUMP]:<signed data is here>
使用相应的公钥对其进行解密:

$ openssl rsautl -verify -in signed-part.bin -pubin -inkey root-public-key.pem -out verified-data.bin
看看结果里面:

$ openssl asn1parse -inform der -in verified-data.bin
    0:d=0  hl=2 l=  33 cons: SEQUENCE          
    2:d=1  hl=2 l=   9 cons: SEQUENCE          
    4:d=2  hl=2 l=   5 prim: OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim: NULL              
   13:d=1  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:<hash here>
$openssl asn1parse-notify der-in-verified-data.bin
0:d=0 hl=2 l=33 cons:序列
2:d=1 hl=2 l=9 cons:序列
4:d=2 hl=2 l=5初始:对象:sha1
11:d=2 hl=2 l=0初始值:空
13:d=1 hl=2 l=20原始:八位字节字符串[十六进制转储]:
[HEX DUMP]
不是我原始数据的SHA1总和


我不明白为什么散列是不同的。显然,这是一个不同于我的原始数据的散列。散列是否也包含任何“已验证的属性”?如果是,如何查看哪些属性已被哈希和签名?

好的,您没有提供完整的示例,但我将尝试使用不同的示例引导您

OpenSSL
asn1parse
对识别经过身份验证的属性没有多大帮助。您可以使用OpenSSL
cms

openssl cms -in data.p7s -noout -cmsout -print
查找
signedAttrs
(“signed attributes”是CMS术语中现在如何调用“authenticated attributes”的)

它将如下所示:

    ...
    signerInfos:
        ...
        signedAttrs:
            object: contentType (1.2.840.113549.1.9.3)
            value.set:
              OBJECT:pkcs7-data (1.2.840.113549.1.7.1)    
            object: signingTime (1.2.840.113549.1.9.5)
            ...
现在返回到
asn1parse
output,并找到相应的部分,可能如下所示:

 ...
 1343:d=5  hl=3 l= 216 cons:      cont [ 0 ]
 1346:d=6  hl=2 l=  24 cons:       SEQUENCE
 1348:d=7  hl=2 l=   9 prim:        OBJECT            :contentType
 1359:d=7  hl=2 l=  11 cons:        SET
 1361:d=8  hl=2 l=   9 prim:         OBJECT            :pkcs7-data
 1372:d=6  hl=2 l=  28 cons:       SEQUENCE
 1374:d=7  hl=2 l=   9 prim:        OBJECT            :signingTime
 ...
(对于这个漂亮的缩进,添加
-i
选项)

现在,提取(
dd…
)数据,包括DER上下文标记头,即偏移量1343,在本例中为长度219。然后将开头的
0xa0
字节替换为
0x31
。您为什么必须这样做,请参见或


此数据的sha1散列现在应该匹配。

亲爱的@mykhal,我有一个关于PKCS7的问题。P7是否用于典型消息(未加密消息)?我的意思是所有P7格式的消息都是加密的吗?在这种格式中加密是强制性的吗?部分“用
0x31
替换开头的
0xa0
字节”保存了我的日期。谢谢。为什么要将4添加到2874?@user1511417因为头使用了4个字节(
hl=4
),所以数据在它之后开始。
 ...
 1343:d=5  hl=3 l= 216 cons:      cont [ 0 ]
 1346:d=6  hl=2 l=  24 cons:       SEQUENCE
 1348:d=7  hl=2 l=   9 prim:        OBJECT            :contentType
 1359:d=7  hl=2 l=  11 cons:        SET
 1361:d=8  hl=2 l=   9 prim:         OBJECT            :pkcs7-data
 1372:d=6  hl=2 l=  28 cons:       SEQUENCE
 1374:d=7  hl=2 l=   9 prim:        OBJECT            :signingTime
 ...