使用不同私钥的 CSR 数字签名

Digital signature for CSR with different private key

我们正在使用 C# 和 bouncy castle .net 库来实现一项功能。假设我们作为 website_A 为最终客户生成 CSR,然后最终客户会将我们生成的 CSR 交给我们的业务合作伙伴 website_B 以获得证书。

以前它工作得很好。注意 keyPair.Public 和 keyPair.Private 来自同一个 RSA 密钥对。可以在此处 https://certlogik.com/decoder.

毫无问题地验证生成的 CSR
        Pkcs10CertificationRequest request = new Pkcs10CertificationRequest(
            "SHA256withRSA",
            new X509Name(subject),
            keyPair.Public,
            null,
            keyPair.Private);

但是,我们的业务合作伙伴 website_B 想要验证最终客户的任何 CSR submitted/uploaded 不仅是有效的 CSR,而且确实是由我们生成的 (website_A)。所以我们创建一对新的 RSA 密钥并将新的 public 密钥传递给 website_B 并使用新的私钥签署任何新的 CSR。所以我们的代码更新如下。请注意 keyPair.Public 和 newKeyPair.Privae 来自不同的 RSA 密钥对。该代码仍然可以生成 CSR,但在 https://certlogik.com/decoder 等验证时失败。奇怪的是,如果跳过 CSR 验证步骤,我们的业务合作伙伴 website_B 仍然可以 parse/decode 我们传递给他们 newKeyPair.Public 的新 CSR 格式。

        Pkcs10CertificationRequest request = new Pkcs10CertificationRequest(
            "SHA256withRSA",
            new X509Name(subject),
            keyPair.Public,
            null,
            newKeyPair.Private);

所以我的 qns 是:

  1. 是我们的业务合作伙伴website_B要求数字签名 CSR(以便他们可以确定 CSR 是由我们生成的)声音?

  2. 如果是,我们如何将 CSR 的数字签名附加到原始 CSR。请注意 Pkcs10CertificationRequest 只能使用一个私钥。

  3. 是否有另一种方法可以使用不同的私钥对对 CSR 进行数字签名?

  1. is our business partner website_B requirement of digital signature of CSR (so that they can be sure the CSR is generated by us) sound?

您的合作伙伴想要一份带有数字签名的真实性证明。这很常见,数字签名就是为此而设计的。

  1. if yes how we can attach the digital signature of CSR with the original CSR. Please note Pkcs10CertificationRequest can only take one private key.

CSR 必须使用证书申请者的私钥签名,并且必须与嵌入的 public 密钥匹配。您正在使用 CSR 作为数字签名容器,它可以证明 website_A 已经生成了 CSR,但对于证书颁发机构来说是无效的,无法确保请求者有效拥有私钥。因此证书注册过程无效。

因为 CSR 不是为此目的而设计的。我建议:

  1. 在带有 website_A 私钥的原始 CSR 上使用 附加数字签名。不需要将此签名附加到 CSR 中。只需使用分离签名或已知格式,如 CMS 或 XMLDSig

  2. 使用自定义证书签名请求格式。您确实不需要标准 PKCS#10,因为您已经在 A 和 B 之间进行了自定义注册过程。使用标准具有明显的优势,但在您的情况下,它是可消耗的,因为仅在初始注册过程中使用。请注意,CSR 在生成后会被丢弃,并且 CSR 与颁发的证书之间没有直接关系。您可以定义一个自定义格式,其中包括请求者的 public 密钥、生成证书所需的数据以及 A 和 B 的两个签名

  1. is there another way to digitally sign CSR with different pair of private key?

否,见上文