我们正在使用C#和bouncy castle .net库来实现一个功能。让我们说我们作为网站_A为最终客户生成CSR,然后最终客户将我们生成的CSR带到我们的业务合作伙伴网站_B获取证书。
以前它工作得非常好。注意keyPair.Public和keyPair.Private来自相同的RSA密钥对。生成的CSR可以在此处https://certlogik.com/decoder无任何问题进行验证。
Pkcs10CertificationRequest request = new Pkcs10CertificationRequest(
"SHA256withRSA",
new X509Name(subject),
keyPair.Public,
null,
keyPair.Private);
但是,我们的业务合作伙伴网站_B希望验证最终客户提交/上传的任何CSR不仅仅是有效的CSR,而且确实由我们生成(website_A)。因此,我们创建一对新的RSA密钥,并将新的公钥传递给website_B,并使用新的私钥对任何新的CSR进行签名。所以我们的代码更新如下。请注意,keyPair.Public和newKeyPair.Privae来自不同的RSA密钥对。代码仍然可以生成CSR,但在验证时失败,例如https://certlogik.com/decoder。很奇怪,虽然我们的业务合作伙伴网站_B仍然可以使用newKeyPair.Public解析/解码新的CSR格式,如果跳过CSR验证步骤,我们会传递给他们。
Pkcs10CertificationRequest request = new Pkcs10CertificationRequest(
"SHA256withRSA",
new X509Name(subject),
keyPair.Public,
null,
newKeyPair.Private);
所以我的qns是:
是我们的业务合作伙伴网站_数字签名的要求 CSR(这样他们可以确定CSR是由我们生成的)听起来如何?
如果是,我们如何将CSR的数字签名与原始CSR相关联。请注意,Pkcs10CertificationRequest只能使用一个私钥。
还有另一种方法可以用不同的私钥对对CSR进行数字签名吗?
答案 0 :(得分:2)
- 是我们的业务合作伙伴网站_对CSR的数字签名的要求(以便他们可以确定CSR是由我们生成的)声音?
醇>
您的伴侣需要使用数字签名进行真实性证明。通常情况下,数字签名就是为此而设计的。
- 如果是,我们如何将CSR的数字签名与原始CSR相结合。请注意,Pkcs10CertificationRequest只能使用一个私钥。
醇>
CSR必须使用证书申请者的私钥进行签名,并且必须与嵌入的公钥匹配。您正在使用CSR作为数字签名容器,可以证明website_A已生成CSR,但对证书颁发机构无效,以确保请求者有效拥有私钥。因此证书注册过程无效。
由于CSR不是为此目的而设计的。我建议:
使用website_A的私钥在原始CSR上使用其他数字签名。不需要将此签名附加到CSR中。只需使用分离的签名或已知格式,如CMS或XMLDSig
使用自定义证书签名请求格式。您真的不需要标准的PKCS#10,因为您已经在A和B之间进行了自定义注册过程。使用标准具有明显的优势,但在您的情况下它是可消耗的,因为它仅用于初始注册过程。请注意,CSR在生成后被丢弃,并且CSR与颁发的证书之间没有直接关系。您可以定义自定义格式,其中包括请求者的公钥,有关证书生成的必需数据以及A和B的两个签名
- 是否有另一种方法可以使用不同的私钥对对CSR进行数字签名?
醇>
不,见上文