我认为这很简单,但显然不是。我安装了一个具有私钥,可导出的证书,我想以编程方式仅使用公钥导出它。换句话说,我想要一个等效于在通过certmgr导出并导出到.CER时选择“不导出私钥”的结果。
似乎所有X509Certificate2.Export方法都会导出私钥(如果存在),如PKCS#12,这与我想要的相反。
有没有办法使用C#来实现这一目标,还是我需要开始深入了解CAPICOM?
答案 0 :(得分:18)
对于其他可能偶然发现的人,我想通了。如果将X509ContentType.Cert
指定为X509Certificate.Export
的第一个(也是唯一的)参数,则仅导出公钥。另一方面,指定X509ContentType.Pfx
包括私钥(如果存在)。
我本来可以发誓我上周看到了不同的行为,但我在测试时必须已经安装了私钥。当我今天删除该证书并从头开始重新开始时,我看到导出的证书中没有私钥。
答案 1 :(得分:8)
我发现以下程序有助于让我自己确认证书的RawData
属性只包含公钥(MSDN对此不清楚),以及上面关于X509ContentType.Cert
对{的回答{1}}按预期工作:
X509ContentType.Pfx
输出以下内容:
Orig : RawData.Length = 1337, HasPrivateKey = True cert A : RawData.Length = 1337, HasPrivateKey = False, certBytes.Length = 1337 cert B : RawData.Length = 1337, HasPrivateKey = True, certBytes.Length = 3187 cert C : RawData.Length = 1337, HasPrivateKey = False, certBytes.Length = 1337 RawData equals original RawData: True
答案 2 :(得分:1)
您可能会发现OpenSSL .NET wrapper有用。