【问题标题】:Why does the Symantec CSR checker think my CSR is missing a NULL value in AlgorithmIdentifier? RFC3279为什么赛门铁克 CSR 检查器认为我的 CSR 在 AlgorithmIdentifier 中缺少 NULL 值? RFC3279
【发布时间】:2017-09-06 14:45:16
【问题描述】:

由于一些不愉快的原因,我一直在尝试使用 bouncycastle API 手动构建自己的证书签名请求。

表面上我选择这样做是因为我需要 CSR 的预签名版本,以便使用存储在 HSM 中的密钥生成 sha256withRSA 签名,在 LMK 下加密,因此此时不能立即使用企业社会责任的创建。

不管怎样,这在这一点上是偶然的。

我已经设法通过与使用 openSSL 生成的其他 CSR 进行比较来创建 CSR 结构,向其中添加所需的信息,将其发送到 HSM 以使用私钥生成签名,取回该签名,然后附加它到 CSR。

然后,我将生成的证书放入了一些 CSR 检查器,尤其是 Symantec 的检查器,因为我相信,我们的 CA 必须对此进行签名。

赛门铁克 CSR 检查器自信地告诉我:

CSR 在其 AlgorithmIdentifier 参数中缺少 NULL 值

嗯。好的。

然后给出一个好的例子:

这是我将这个特定的 NULL 值添加到 AlgorithmIdentifier 对象的代码:

    ASN1EncodableVector topLevelPublicKeySequenceVector = new ASN1EncodableVector();
    ASN1EncodableVector publicKeySequenceVector = new ASN1EncodableVector();
    AlgorithmIdentifier rsaEncryptionOid = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE);      

    ASN1Integer pkModulus = new ASN1Integer(publicKey.getModulus());
    ASN1Integer pkExponent = new ASN1Integer(publicKey.getPublicExponent());
    publicKeySequenceVector.add(pkModulus);
    publicKeySequenceVector.add(pkExponent);
    DERSequence publicKeySequence = new DERSequence(publicKeySequenceVector);
    DERBitString publicKeyBitString = null;
    try {
        publicKeyBitString = new DERBitString(publicKeySequence);
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    topLevelPublicKeySequenceVector.add(rsaEncryptionOid);
    topLevelPublicKeySequenceVector.add(publicKeyBitString);

    DERSequence topLevelPublicKeySequence = new DERSequence(topLevelPublicKeySequenceVector);

所以,如果我将我的 CSR 放入 ASN.1 解码器中,查看这个 AlgorithmIdentifier 参数并验证它确实缺少这个 NULL 值,我会得到以下输出(包含虚假值StackOverflow 的好处),这表明我的 NULL 值似乎就在那里,我希望它在哪里:

SEQUENCE(3 elem)
   SEQUENCE(3 elem)
   INTEGER 0
   SEQUENCE(7 elem)
      SET(1 elem)
         SEQUENCE(2 elem)
            OBJECT IDENTIFIER 2.5.4.6 countryName (X.520 DN component)
            PrintableString GB
      SET(1 elem)
         SEQUENCE(2 elem)
            OBJECT IDENTIFIER 2.5.4.8 stateOrProvinceName (X.520 DN component)
            UTF8String Sol
      SET(1 elem)
         SEQUENCE(2 elem)
            OBJECT IDENTIFIER 2.5.4.7 localityName (X.520 DN component)
            UTF8String Earth
      SET(1 elem)
         SEQUENCE(2 elem)
            OBJECT IDENTIFIER 2.5.4.10 organizationName (X.520 DN component)
            UTF8String Stackoverflow
      SET(1 elem)
         SEQUENCE(2 elem)
            OBJECT IDENTIFIER 2.5.4.11 organizationalUnitName (X.520 DN component)
            UTF8String Stackoverflow
      SET(1 elem)
         SEQUENCE(2 elem)
            OBJECT IDENTIFIER 2.5.4.3 commonName (X.520 DN component)
            UTF8String common.name.for.stackoverflow
      SET(1 elem)
         SEQUENCE(2 elem)
         OBJECT IDENTIFIER 1.2.840.113549.1.9.1 emailAddress (PKCS #9)
         IA5String duff.value@forstackoverflow.com
   SEQUENCE(2 elem)
      SEQUENCE(2 elem)
         OBJECT IDENTIFIER 1.2.840.113549.1.1.1 rsaEncryption (PKCS #1)
         NULL
      BIT STRING(1 elem)
         SEQUENCE(2 elem)
            INTEGER(2048 bit) 231457529965blahblahetc
            INTEGER65537
   SEQUENCE(2 elem)
      OBJECT IDENTIFIER 1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1)
      NULL
   BIT STRING(2048 bit) 1011010etc etc...

因此,对于我所描述的这种略微迂回的方式表示歉意,有没有人最模糊的想法为什么我的 CSR 会无法验证缺失的字段,也就是说,它看起来,实际上并没有缺失?

编辑: 这是实际的请求(或者至少,出于本问题的目的,我使用具有相同症状的无意义值生成的请求)

-----BEGIN CERTIFICATE REQUEST-----
MIIC6zCCAdMCAQAwgaUxCzAJBgNVBAYTAkdCMQwwCgYDVQQIDANTb2wxDjAMBgNV
BAcMBUVhcnRoMRYwFAYDVQQKDA1TdGFja292ZXJmbG93MRYwFAYDVQQLDA1TdGFj
a292ZXJmbG93MRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20xLjAsBgkqhkiG9w0B
CQEWH2R1ZmYudmFsdWVAZm9yc3RhY2tvdmVyZmxvdy5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDrH2qNz5wtTc9jFQPoTfdk1Mf9N1LGXrqyV5sA
1w9Y4BGGJNm3yW0KUPLxyHhSJLWzHqdKzcLwlocSJvYVrMmBG9agOnHhX1aQLrnr
ruEAP7aN/gHW9isQLk6/MJPt8TkIby6azR0qq4VYR/+6dRCv7PhVvGBMxWjdQbEa
UxJAyq3eVMNBMdDdrOIMLrvxF3xcido4O9qWtdXFQwUgXoUGJG0sY3tXpwE5jB7A
1MWayfbSXj2NATU9fqHhwEoPwBm4yw65Hg+VDHWABCR/qYmLQKrVThF9UE4RUy5I
+DMRoTOUX3YRqZkg3aaCfe/LtuoHhfsCSZwxak2GZ1TI8vWBAgMBAAGgADANBgkq
hkiG9w0BAQsFAAOCAQEAoqTYzypOlLKSrF4+5jKqbRgC+9JBUhYKmQcAIaDzmDNf
0ZHwxG4iGeCS5pj60MKpv6gxUZcLhwgcm717XZrMMR4dD9yILyJsFp7C8MnOgYpB
C/VzSBwH8FvmnVsSmOcAR8IcvXLW2BpTgH6tSiFsU+xlpUWUUceFL97xZAiM93cZ
tdsH6KbKo/YvCbKhGkX311S+oTPk1oSvu5znRXBl2iyk3wbFiC9blARIcfYlhGPH
gL/ic+7+Mn5qmOY8w39Y42aP/G4ISG8h52Q1pbxH7B/I++sK73yTwRZCf1tprMP6
27j3Bpr72VY1Egge97rrb8KcL+K+A84/74Ad7NNywQ==
-----END CERTIFICATE REQUEST-----

【问题讨论】:

  • 您能告诉我们实际的 PKCS#10 请求吗?我尝试验证请求 here 并且没问题。唯一的区别是我做了 sha1withrsaencryption(你做了 sha256)并且请求中有一个扩展部分。
  • 嗨 pepo - 我添加了一个我生成的示例 CSR。我使用了您链接到的相同 CSR 检查器。如果您将上述内容粘贴到其中,您应该会看到我看到的验证错误。
  • 赛门铁克检查器可能会发现错误但返回错误消息。您似乎缺少 CertificateRequestInfo 的属性部分。
  • 好发现!我现在为属性添加了空的标记集。唉,然而,看起来不是这样。我已经更新了问题中的证书请求。
  • @JamesKPolk 错误信息是完全错误的。应该说 PKCS#10 请求签名验证失败 :) 尝试使用 openssl/xca/certreq 生成 PKCS#10 请求并将签名算法 oid 的值更改为其他值。

标签: java certificate bouncycastle asn.1


【解决方案1】:

错误信息完全错误。应该说 PKCS#10 请求签名验证失败:)

尝试使用 openssl/xca/certreq 生成 PKCS#10 请求,并将签名算法 oid 的值更改为其他值。

【讨论】:

  • 成功了!签名不正确,因为我在发送到 HSM 之前对其进行了哈希处理,而实际上,尽管 HSM 命令手册中的措辞有些模糊,但 HSM 会自行执行哈希处理步骤。
  • pepo & @James K Polk 感谢各位的帮助;我盯着那个看太久了!
【解决方案2】:

相关结构在PKCS#10中定义。

CertificationRequest ::= SEQUENCE {
        certificationRequestInfo CertificationRequestInfo,
        signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
        signature          BIT STRING
   }

   AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {
        algorithm          ALGORITHM.&id({IOSet}),
        parameters         ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
   }

CertificationRequestInfo ::= SEQUENCE {
        version       INTEGER { v1(0) } (v1,...),
        subject       Name,
        subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
        attributes    [0] Attributes{{ CRIAttributes }}
   }

   SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {
        algorithm        AlgorithmIdentifier {{IOSet}},
        subjectPublicKey BIT STRING
   }

特别注意CertificationRequestInfo 序列中的最后一个元素:attributes [0] Attributes{{ CRIAttributes }}

不是可选的,即使没有属性也必须存在,但它在您的 CSR 中缺失。来自 CSR 检查器的错误消息似乎有误,但您的 CSR 中有错误。

【讨论】:

  • 谢谢詹姆斯;我怀疑我们在那里同时进行编辑/贡献。我回复了您之前的评论-很好的回复:缺少的属性部分。我已添加并更新了问题中的 CSR。遗憾的是,这似乎不是错误的原因。
  • @Bannatyne84:啊,太糟糕了。否则对我来说看起来不错。继续挠头。
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多