2

我正在尝试实现一个安全的 TCP 服务器,因此我需要创建一个类对象X509Certificate2以对客户端进行身份验证。

我相信这样的证书对象应该包含私钥(以及)以便能够解密传入的消息,不是吗?好吧,无论我如何生成证书文件,当我将其文件地址提供给X509Certificate2' 的构造函数时,对象的HasPrivateKey属性都是 false 并且客户端未经过身份验证!

在 Microsoft 关于如何使用X509Certificate2该类的页面中,在源代码的注释中表明可以使用makecert如下程序生成证书:

makecert -r -pe -n "CN=CERT_SIGN_TEST_CERT" -b 01/01/2010 -e 01/01/2012 -sky exchange -ss my

在哪个-pe开关中应该在证书中包含私钥,但是查看生成的文件我可以看出它没有这样做。

由于我使用 Mono 在 Ubuntu 中实现这个软件,所以我想我可以使用它openssl。因此,按照此页面中给出的说明,我创建了一个私钥和一个公钥。X509Certificate2类接受公钥,就好像它是由makecert命令创建的,但不接受私钥(它在构造时抛出异常)。

SO中有一篇相对较旧的帖子提出了同样的问题,但没有公认的答案。并且给出的两个建议使用两种不同的证书格式,PKCS8 和 PKCS12,而在文档中明确表示X509Certificate使用 PKCS7!

反正我都糊涂了。有没有人能够使用X509Certificate2加载的私钥?如何?

4

1 回答 1

2

X509 证书应该只包含一个公钥。它将公钥绑定到身份并进行签名。 RFC 5280 包​​含有关 X509 证书的详细信息。

但是,根据MSDN 文档X509Certificate2,该对象可以包含私钥。

此外,密钥库(例如 PKCS12 密钥库)可以包含私钥和相应的证书。

PKCS7 是用于签名和加密消息的规范。

PKCS8 是私钥的规范。

有关不同 PKCS 标准之间的差异,请参阅PKCS 。

上面的 MSDN 链接有一些用于加密和解密文件的示例 C# 代码。它还有一个示例makecert命令行来生成证书。但是,此证书和关联的私钥存储在 Windows 本地用户存储中,因此我不确定这是否会正确转换为 Ubuntu。

在这个SO question中也有一些关于使用 PKCS12 密钥库来实例化X509Certificate2对象然后访问私钥的讨论。这可能是您实现目标的更好方法。您可以使用 openssl 生成私钥、签名证书,并将它们导入 PKCS12 密钥库。您可以使用此处的命令创建 PKCS12 密钥库。例如,创建一个文本文件 (file.pem),其中包含您的私钥的 PEM 格式和相应的 X509 证书。然后运行这个命令:

openssl pkcs12 -export -in file.pem -out file.p12 -name "My Certificate"

同样在makecert文档页面上,它说“仅用于测试目的”。所以我不会依赖这些证书来生产安全服务器。

于 2013-09-06T22:26:13.943 回答