【问题标题】:Instantiating a X509Certificate object in C# which holds a private key as well在 C# 中实例化一个 X509Certificate 对象,该对象也包含一个私钥
【发布时间】:2013-09-10 12:38:14
【问题描述】:

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

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

在微软的how to use the X509Certificate2 class页面中,在源代码的cmets中表明可以使用makecert程序生成证书,如下所示:

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

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

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

SO 中有一个relatively old post,它提出了同样的问题,但没有接受的答案。并且给出的两个建议使用两种不同的证书格式,PKCS8 和 PKCS12,而在 the documentation 中明确表示 X509Certificate 使用 PKCS7!

反正我很困惑。有没有人能够在加载私钥的情况下使用X509Certificate2?怎么样?

【问题讨论】:

    标签: c# openssl private-key x509certificate2 makecert


    【解决方案1】:

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

    但是,X509Certificate2 对象可以包含根据MSDN documentation 的私钥。

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

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

    PKCS8 是私钥规范。

    请参阅PKCS 了解不同 PKCS 标准之间的差异。

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

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

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

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

    【讨论】:

    • 感谢您的帖子。阅读了 PKCS、维基百科链接和您的帖子之间的差异后,我想知道 X509Certificate 类是否能够解密传入的消息,因为需要私钥。然而,它用于实现安全服务器!你有任何关于它的cmets吗?
    • 我已经稍微编辑了我的答案。 MSDN 文档似乎确实表明 X509Certificate2 对象(不同于 X509Certificate 对象)可以包含私钥。
    • 谢谢,我成功地使用openssl 导出了一个PKCS12 文件,X509Certificate2 顺利使用了它。完成后,HasPrivateKey 属性为真。
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多