使用不同私钥的 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 是:
是我们的业务合作伙伴website_B要求数字签名
CSR(以便他们可以确定 CSR 是由我们生成的)声音?
如果是,我们如何将 CSR 的数字签名附加到原始 CSR。请注意 Pkcs10CertificationRequest 只能使用一个私钥。
是否有另一种方法可以使用不同的私钥对对 CSR 进行数字签名?
- 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?
您的合作伙伴想要一份带有数字签名的真实性证明。这很常见,数字签名就是为此而设计的。
- 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 不是为此目的而设计的。我建议:
在带有 website_A 私钥的原始 CSR 上使用 附加数字签名。不需要将此签名附加到 CSR 中。只需使用分离签名或已知格式,如 CMS 或 XMLDSig
使用自定义证书签名请求格式。您确实不需要标准 PKCS#10,因为您已经在 A 和 B 之间进行了自定义注册过程。使用标准具有明显的优势,但在您的情况下,它是可消耗的,因为仅在初始注册过程中使用。请注意,CSR 在生成后会被丢弃,并且 CSR 与颁发的证书之间没有直接关系。您可以定义一个自定义格式,其中包括请求者的 public 密钥、生成证书所需的数据以及 A 和 B 的两个签名
- is there another way to digitally sign CSR with different pair of 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 是:
是我们的业务合作伙伴website_B要求数字签名 CSR(以便他们可以确定 CSR 是由我们生成的)声音?
如果是,我们如何将 CSR 的数字签名附加到原始 CSR。请注意 Pkcs10CertificationRequest 只能使用一个私钥。
是否有另一种方法可以使用不同的私钥对对 CSR 进行数字签名?
- 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?
您的合作伙伴想要一份带有数字签名的真实性证明。这很常见,数字签名就是为此而设计的。
- 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 不是为此目的而设计的。我建议:
在带有 website_A 私钥的原始 CSR 上使用 附加数字签名。不需要将此签名附加到 CSR 中。只需使用分离签名或已知格式,如 CMS 或 XMLDSig
使用自定义证书签名请求格式。您确实不需要标准 PKCS#10,因为您已经在 A 和 B 之间进行了自定义注册过程。使用标准具有明显的优势,但在您的情况下,它是可消耗的,因为仅在初始注册过程中使用。请注意,CSR 在生成后会被丢弃,并且 CSR 与颁发的证书之间没有直接关系。您可以定义一个自定义格式,其中包括请求者的 public 密钥、生成证书所需的数据以及 A 和 B 的两个签名
- is there another way to digitally sign CSR with different pair of private key?
否,见上文