我迷失在证书和私钥的迷宫中。
我正在用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解决了这个问题,因为需要管理员权限才能访问机器存储证书的私钥。