13

我迷失在证书和私钥的曲折迷宫中。

我正在用 C# 编写服务器。我希望它接受 SSL 连接。出于测试目的,我想为“localhost”生成一个证书,并将该证书用于服务器。理想情况下,我不想污染我的证书存储,所以我只想要一个或多个 C# 代码可以加载的磁盘上的文件来提供证书。

我尝试过的一切(使用网络搜索建议的食谱方法)要么给我“无​​法识别提供给包的凭据”或“服务器模式 SSL 必须使用带有关联私钥的证书”。

有没有办法生成证书和私钥,然后将它们加载到 X509Certificate 对象中而不将它们加载到我的机器证书存储中?

4

6 回答 6

17

最后,我运行以下命令来创建 server.pfx 文件:

makecert.exe -r -pe -n "CN=localhost" -sky exchange -sv server.pvk server.cer
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx

然后我在代码中加载它:

certificate = new X509Certificate2("server.pfx", "password");

(我实际上并没有像那样硬编码密码:-)

诀窍是知道我需要一个 pfx 文件,并且我需要使用 X509Certificate2 类而不是 X509Certificate 来加载它。

于 2013-01-08T19:30:10.287 回答
8

Niki Loche 方法有效。

如果你得到The specified network password is not correct.,那么你应该在 C# 中尝试不带密码。您输入的密码是什么并不重要makecert

certificate = new X509Certificate2("Server.pfx", "");

但是如果你想使用密码(这是有原因的,它就在那里:)),尝试将pvk2pfx.exe命令更改为:

pvk2pfx.exe" -pi 密码 -pvk Server.pvk -spc Server.cer -pfx Server.pfx

并在 C# 中输入:

证书 = new X509Certificate2("Server.pfx", "password");

密码必须与创建 cer 文件时的密码相同。

这对我有用。我希望它会帮助某人。

于 2013-11-01T00:49:22.337 回答
1

有许多工具可以让您充当自己的 CA 并生成证书。XCA就是其中之一。例如,还有许多使用 OpenSSL 命令的方法。

仅生成自签名证书似乎是最简单的选择,但使用测试 CA(和单独的服务器证书)可能是值得的。如果需要使测试更真实,这将允许您将测试 CA 导入浏览器的存储中。使用正确的工具(例如 XCA)并不难。

生成服务器证书及其私钥后,将其转换为 PKCS#12 文件 (.p12/.pfx)。

然后,您应该能够使用X509Certificate2.import(...). (请参阅此答案中的示例。)

于 2013-01-08T13:57:39.570 回答
1

我最近开发了一个带有 TLS 的 SMTP 服务器。我需要将服务器作为 Windows 服务安装在 Windows Server 2012 机器上。我为我的域使用了 Let's Encrypt SSL 证书(* 通配符)。在“在服务器上”开发时,我必须以管理员身份运行 Visual Studio,我的代码才能使用“new X509Certificate("cert.pfx", "{password}") 运行,并且运行良好。但是,一旦作为服务安装,该方案不起作用。原来更简单/更安全的方法是使用 X509Store。这是解决问题的代码......

private X509Certificate GetSslCertificate()
{
    X509Certificate cert = null;
    string certname = "*.mydomain.com";

    try
    {
        X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        store.Open(OpenFlags.OpenExistingOnly);

        foreach (X509Certificate certificate in store.Certificates)
        {
            if (certificate.Subject.ToLower().Contains(certname))
            {
                cert = certificate;
                break;
            }
        }
    }
    catch (Exception) { /* Handle Exception */ }
    return cert;
}

另请注意,我使用“LocalMachine”作为 StoreLocation。如果您安装了 SSL 证书,则需要更改为 CurrentUser。

于 2020-12-03T18:08:53.383 回答
0

从机器存储(而不是用户存储)导入机器证书时,我遇到了同样的问题。我通过以管理员身份运行 Visual Studio 解决了这个问题,因为访问机器存储证书的私钥需要管理员权限。

于 2014-09-09T22:44:18.620 回答
0

如果您有 IIS,则可以通过 IIS 管理器进行操作,如下所述:

http://blogs.msdn.com/b/ericnel/archive/2009/09/22/using-iis-to-generate-a-x509-certificate-for-use-with-the-windows-azure-service-管理-api-step-by-step.aspx

于 2014-06-18T16:20:28.137 回答