如何创建与SslStream AuthenticateAsServer一起使用的证书而无需导入



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

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

我所尝试的一切(使用web搜索建议的食谱方法)要么给我"提供给包的凭据未被识别"或"服务器模式SSL必须使用带有关联私钥的证书"。

是否有一种方法可以生成证书和私钥,然后将它们加载到X509Certificate对象中,而不将它们加载到我的机器证书存储中?

最后,我运行以下命令来创建服务器。可以文件:

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。

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.pfx

在c#中输入:

certificate = new X509Certificate2("服务器。可以"、"密码");

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

那对我起作用了。

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

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

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

你应该能够使用X509Certificate2.import(...)加载它。

我最近开发了一个带有TLS的SMTP服务器。我需要将服务器作为Windows Service安装在Windows server 2012上。我使用了一个让我们加密SSL证书(*通配符)为我的域。在"服务器"上进行开发时我必须以管理员身份运行Visual Studio,才能使用"新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。

如果你有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-management-api-step-by-step.aspx

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

最新更新