C# 如何在不导入的情况下创建用于SslStream服务器的证书

C# 如何在不导入的情况下创建用于SslStream服务器的证书,c#,ssl,x509certificate,C#,Ssl,X509certificate,我迷失在证书和私钥的迷宫中 我正在用C#编写一个服务器。我希望它接受SSL连接。出于测试目的,我想为“localhost”生成一个证书,并将该证书用于服务器。理想情况下,我不想污染我的证书存储,所以我只希望在磁盘上有一个或多个文件,C#代码可以加载这些文件来提供证书 我尝试过的一切(使用web搜索建议的cookbook方法)要么给我“提供给包的凭据未被识别”,要么“服务器模式SSL必须使用带有相关私钥的证书” 有没有办法生成证书和私钥,然后将它们加载到X509Certificate对象中,而不将

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

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

我尝试过的一切(使用web搜索建议的cookbook方法)要么给我“提供给包的凭据未被识别”,要么“服务器模式SSL必须使用带有相关私钥的证书”


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

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

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

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


然后,您应该能够使用来加载它。(参见中的示例。)

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

Niki-Loche方法有效

如果您获得的
指定的网络密码不正确。
,则应在C#中尝试不使用密码。在
makecert
中输入的密码是什么并不重要

certificate = new X509Certificate2("Server.pfx", "");
但如果您想使用密码(有一个原因,它就在那里:),请尝试将pvk2pfx.exe命令更改为:

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

在C中输入:

证书=新的X509Certificate2(“Server.pfx”、“密码”)

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


这就成功了。我希望它能帮助别人。

如果你有IIS,你可以通过IIS管理器完成,详情如下:


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

我最近开发了一个带有TLS的SMTP服务器。我需要在Windows server 2012机箱上将服务器作为Windows服务安装。我使用了Let's Encrypt 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”作为存储位置。如果安装SSL证书的地方是CurrentUser,则需要更改为CurrentUser。

您真的需要此证书还是只想跳过证书。使用它检查??服务器是web服务器。我需要使用https协议从浏览器连接到它。所以我想我需要证书。我知道证书将不受信任,因此浏览器用户将不得不接受它。救了我的命。我使用此方法通过代理服务器应用程序向客户端浏览器提供证书。我知道这不是一个正确的方法,但仍然一切正常。但这种方法不适合代理服务器。你知道怎么解决吗?不行。我得到一个
cryptographicsexception
说“指定的网络密码不正确”。这显然是错误的,因为我使用了密码
x
,很难输入错误。有什么解决办法吗?我只能说上面的代码对我有用。您可以使用密码“x”使用任何其他工具打开pfx吗?其他生成的文件的用途是什么,它们也需要存在吗?没有IIS,但这可能对有IIS的人有用,谢谢。对于希望使用此解决方案的人来说。我认为我的答案可以补充@Bruno所说的,我将向您展示使用OpenSSL生成有效证书的方法。