我目前正在尝试使用IIS7 +提供的Microsoft.Web.Administration
库动态添加一个新网站。这将成为安装过程的一部分,在此过程中需要添加自签名证书并绑定到本网站的HTTPS绑定。动态添加一个HTTPS绑定的网站,指向一个动态生成的自签名证书
我的研究把我带到StackOverflow的这篇文章,它利用BouncyCastle API:Generate self signed certificate on the fly。我试图复制IIS管理工具提供的功能,通过对代码进行轻微更改来创建此类证书。我已经修改了两种方法中的签名算法,从SHA256WithRSA
到SHA1WithRSA
。我也使用Dns.GetHostEntry("127.0.0.1").HostName
作为本地计算机的名称传递主题名称和IssuerName。我还设置了X509Certificate2
对象的友好名称属性。最终修改涉及将addCertToStore
方法的参数作为StoreLocation.LocalMachine
通过sl参数。
以下是代码的一个片断用于动态创建的网站并添加HTTPS结合传递cert.GetCertHash()
数据作为参数传递给Site.Bindings.Add(...)
方法,该方法取绑定信息,证书散列值在和证书店铺名称(见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证书之间的映射失败。
个人证书本地计算机下 - >个人:
该映像包含个人证书为根据本地计算机部分出现在证书管理器的列表。第一个是动态生成的,而第一个是使用IIS管理工具创建的。
以上是自签名证书,证书的详细信息使用IIS管理工具(左侧)以及动态地生成一个(右侧)创建的。
一些他们两人之间最显着的区别是:
- 缺少密钥使用动态生成一个和增强型密钥用法细节。
- 证书状态和图标表示存在错误。
所以问题是什么是错误的代码涉及创建自签名证书,导致映射到新的IIS网站失败?
谢谢
'X509KeyStorageFlags.MachineKeySet'是我的解决方案,谢谢! – 2017-05-19 12:30:39