首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用安全元素芯片生成CMS,了解CMS签名的生成方式(带有签名者信息和签名属性的签名数据)

使用安全元素芯片生成CMS,了解CMS签名的生成方式(带有签名者信息和签名属性的签名数据)
EN

Stack Overflow用户
提问于 2020-07-21 10:46:34
回答 1查看 174关注 0票数 0

我们有一个用python编写的测试套件,我必须使用PKI来添加测试。对于证书注册,我必须将CSR和制造证书放在CMS中,并将其发送到PKI。

使用openssl,我可以使用:

代码语言:javascript
复制
openssl smime -sign -outform PEM -signer manufacture.crt -inkey DMC.key -in CSR.pem -binary -nodetach -out CMS.p7

在本例中,我的密钥是用openssl生成的。但是我们必须使用硬件安全元素来生成密钥并计算签名。到目前为止,我可以用python创建相同的CMS结构,但是我不能用openssl验证它:

代码语言:javascript
复制
openssl cms -verify -noverify -inform PEM -in python_generated_cms.txt

结果是“验证失败”。但是当我添加选项-nosigs时,optput就是我的CSR。所以我的签名似乎无效。我学过rfc5652,但没有成功。

下面是我计算签名的工作流程:

  1. 根据第11.2章,消息摘要是PEM编码的CSR编码的摘要算法。
  2. 然后第5.4章说,如果存在SignedAttrs,则签名计算的输入是signedAttrs的完全内部值。因此,我采用了signedAttrs内容的完整二进制表示(在下面一节中用*标记)。
  3. 通过将第一个字节形式0xA0更改为0x31,我将“隐式标记”更改为“显式集合”。
  4. 使用与我的硬件安全元素(SHA384)算法相对应的算法对这些数据进行散列。
  5. 将此散列发送到seucre元素以计算签名。
  6. 签名由48个字节组成,每个r和s部分将打包成以0x30,0x64开头的ans1签名,并将其作为签名添加到签名者信息中。

下面是我分析的CMS示例:

代码语言:javascript
复制
SEQUENCE (2 elem)
  OBJECT IDENTIFIER 1.2.840.113549.1.7.2 signedData (PKCS #7)
  [0] (1 elem)
    SEQUENCE (5 elem)
      INTEGER 1
      SET (1 elem)
        SEQUENCE (2 elem)
          OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
          NULL
      SEQUENCE (2 elem)
        OBJECT IDENTIFIER 1.2.840.113549.1.7.1 data (PKCS #7)
        [0] (1 elem)
          OCTET STRING (416 byte) 2D2D2D2D2D424547494E20434554553542D2D2D2D2…        [CMS]
      [0] (1 elem)
        SEQUENCE (3 elem)
          
                ... shorted certificate here ...

          SEQUENCE (1 elem)
            OBJECT IDENTIFIER 1.2.840.10045.4.3.3 ecdsaWithSHA384 (ANSI X9.62 ECDSA algorithm with SHA384)
          BIT STRING (1 elem)
            SEQUENCE (2 elem)
              INTEGER (384 bit) 251806783159843676750320964557058746…
              INTEGER (383 bit) 146223079633757899471433693312235433…
      SET (1 elem)
        SEQUENCE (6 elem)
          INTEGER 1
          SEQUENCE (2 elem)
            SEQUENCE (4 elem)
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.6 countryName (X.520 DN component)
                  PrintableString CH
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.10 organizationName (X.520 DN component)
                  PrintableString My organisation
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.11 organizationalUnitName (X.520 DN component)
                  PrintableString PKI
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.3 commonName (X.520 DN component)
                  PrintableString Non-Prod CA
            INTEGER (82 bit) 3419130548216348442042883485
          SEQUENCE (2 elem)
            OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
            NULL
*         [0] (4 elem)
*           SEQUENCE (2 elem)
*             OBJECT IDENTIFIER 1.2.840.113549.1.9.3 contentType (PKCS #9)
*             SET (1 elem)
*               OBJECT IDENTIFIER 1.2.840.113549.1.7.1 data (PKCS #7)
*           SEQUENCE (2 elem)
*             OBJECT IDENTIFIER 1.2.840.113549.1.9.5 signingTime (PKCS #9)
*             SET (1 elem)
*               UTCTime 2020-06-26 07:13:41 UTC
*           SEQUENCE (2 elem)
*             OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
*             SET (1 elem)
*               OCTET STRING (32 byte) 6558254059E939DF800A748CCF2F582371AC1…     [message digest]
*           SEQUENCE (2 elem)
*             OBJECT IDENTIFIER 1.2.840.113549.1.9.15 sMIMECapabilities
*             SET (1 elem)
*               SEQUENCE (8 elem)
*                 SEQUENCE (1 elem)
*                   OBJECT IDENTIFIER 2.16.840.1.101.3.4.1.42 aes256-CBC (NIST Algorithm)
*                 SEQUENCE (1 elem)
*                   OBJECT IDENTIFIER 2.16.840.1.101.3.4.1.22 aes192-CBC (NIST Algorithm)
*                 SEQUENCE (1 elem)
*                   OBJECT IDENTIFIER 2.16.840.1.101.3.4.1.2 aes128-CBC (NIST Algorithm)
*                 SEQUENCE (1 elem)
*                   OBJECT IDENTIFIER 1.2.840.113549.3.7 des-EDE3-CBC (RSADSI encryptionAlgorithm)
*                 SEQUENCE (2 elem)
*                   OBJECT IDENTIFIER 1.2.840.113549.3.2 rc2CBC (RSADSI encryptionAlgorithm)
*                   INTEGER 128
*                 SEQUENCE (2 elem)
*                   OBJECT IDENTIFIER 1.2.840.113549.3.2 rc2CBC (RSADSI encryptionAlgorithm)
*                   INTEGER 64
*                 SEQUENCE (1 elem)
*                   OBJECT IDENTIFIER 1.3.14.3.2.7 desCBC
*                 SEQUENCE (2 elem)
*                   OBJECT IDENTIFIER 1.2.840.113549.3.2 rc2CBC (RSADSI encryptionAlgorithm)
*                   INTEGER 40
          SEQUENCE (1 elem)
            OBJECT IDENTIFIER 1.2.840.10045.4.3.2 ecdsaWithSHA256 (ANSI X9.62 ECDSA algorithm with SHA256)
          OCTET STRING (1 elem)
            SEQUENCE (2 elem)
              INTEGER (384 bit) 37299296495250608665729486640423992…
              INTEGER (383 bit) 16047350112473148250997959352782288…

在计算CMS的签名时,我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-06-09 20:22:58

诀窍是,签名不仅是在SHA哈希上计算的,而且在计算签名之前,哈希必须打包成ASN.1序列。也请看一下这里的问题。@Marc在解释它方面做得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63012836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档