我目前正在尝试使用IIS7 +提供的Microsoft.Web.Administration
库动态添加新网站。这将成为安装过程的一部分,其中需要添加自签名证书并将其绑定到此网站的HTTPS绑定。
我的研究转到了StackOverflow上的这篇文章,该帖子使用了 BouncyCastle API:Generate self signed certificate on the fly。我试图通过对代码进行轻微更改来复制IIS管理工具提供的功能,以创建此类证书。我已经在SHA256WithRSA
到SHA1WithRSA
的两种方法中修改了签名算法。我还使用Dns.GetHostEntry("127.0.0.1").HostName
将 SubjectName 和 IssuerName 作为本地计算机的名称传递。我还设置了X509Certificate2
对象的 FriendlyName 属性。最后修改涉及将addCertToStore
方法的 sl 参数传递为StoreLocation.LocalMachine
。
以下是动态创建网站并添加HTTPS绑定的代码片段,该绑定将cert.GetCertHash()
数据作为参数传递给Site.Bindings.Add(...)
方法,该方法接收绑定信息< / strong>,证书哈希和证书商店名称(请参阅MSDN documentation):
using (ServerManager iisManager = new ServerManager())
{
Site testSite = iisManager.Sites.Add(siteName, targetDir, sitePortNumber);
testSite.Bindings.Add("*:" + sitePortNumber + ":", certificateHash, "MY");
iisManager.CommitChanges();
}
问题是,当尝试在IIS中提交更改时,我得到以下COMException
:
指定的登录会话不存在。它可能已经被终止了。 (HRESULT异常:0x80070520)
检查IIS中发生的情况,似乎证书存在,但未正确映射:
在上面链接的图片中,最顶层的证书是动态添加的证书,即我的帖子中提到的证书。最后一个是通过IIS管理工具创建的自签名证书示例。
上面链接的图像显示HTTPS绑定和新创建的SSL证书之间的映射失败。
本地计算机下的个人证书 - &gt;个人:
此图像包含本地计算机部分下的证书管理器中的个人证书列表。最上面一个是动态生成的,而底部是使用IIS管理工具创建的。
以上是使用IIS管理工具(左侧)和动态生成的证书(右侧)创建的自签名证书的证书详细信息。
两者之间最显着的差异是:
所以问题是涉及创建自签名证书的代码有什么问题,导致映射到新的IIS网站失败?
由于
答案 0 :(得分:3)
将SSL证书从当前用户移至本地计算机并且运行正常。
这是我添加证书的代码。
我还注意到X509KeyStorageFlags.MachineKeySet
是唯一没有产生错误的标志。
string certPath = "c:/test2/certName.p12";
string certPass = "TestPassword";
// Create a collection object and populate it using the PFX file
X509Certificate2Collection collection = new X509Certificate2Collection();
collection.Import(certPath, certPass, X509KeyStorageFlags.MachineKeySet);
foreach (X509Certificate2 cert in collection)
{
if(cert.Subject.Equals("CN=TestServer, O=Test"))
{
X509Store store1 = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store1.Open(OpenFlags.ReadWrite);
store1.Add(cert);
store1.Close();
}
if (cert.Subject.Equals("CN=TestClient, OU=Applications, O=Test"))
{
X509Store store1 = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store1.Open(OpenFlags.ReadWrite);
store1.Add(cert);
store1.Close();
}
}
这是我创建绑定的代码
ServerManager serverManager = new ServerManager();
var site = serverManager.Sites["Default Web Site"];
site.Bindings.Add("*:443:TestClient", certificate[0].GetCertHash(), "MY");
// site.Bindings.Add("*:443:TestClient", "https");
serverManager.CommitChanges();