如何在不导入的情况下创建与SslStream AuthenticateAsServer一起使用的证书

时间:2013-01-08 11:54:36

标签: c# ssl x509certificate

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

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

我尝试的所有内容(使用网络搜索建议的菜谱方法)或者给我“提供给包的凭据无法识别”或“服务器模式SSL必须使用带有相关私钥的证书。”

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

6 个答案:

答案 0 :(得分:15)

最后,我运行以下命令来创建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来加载它。

答案 1 :(得分:7)

Niki Loche方法有效。

如果你得到The specified network password is not correct.,那么你应该在C#中没有密码的情况下尝试一下。 makecert中的输入密码无关紧要。

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

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

pvk2pfx.exe“-pi password -pvk Server.pvk -spc Server.cer -pfx Server.pfx

并在C#中输入:

certificate = new X509Certificate2(“Server.pfx”,“password”);

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

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

答案 2 :(得分:1)

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

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

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

然后您应该可以使用X509Certificate2.import(...)加载它。 (参见this answer中的示例。)

答案 3 :(得分:1)

我最近开发了带有TLS的SMTP服务器。我需要在Windows Server 2012上将服务器作为Windows服务安装。我为我的域使用了“让我们加密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。

答案 4 :(得分:0)

答案 5 :(得分:0)

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