2014-10-09 86 views
1

我目前正在尝试使用IIS7 +提供的Microsoft.Web.Administration库动态添加一个新网站。这将成为安装过程的一部分,在此过程中需要添加自签名证书并绑定到本网站的HTTPS绑定。动态添加一个HTTPS绑定的网站,指向一个动态生成的自签名证书

我的研究把我带到StackOverflow的这篇文章,它利用BouncyCastle API:Generate self signed certificate on the fly。我试图复制IIS管理工具提供的功能,通过对代码进行轻微更改来创建此类证书。我已经修改了两种方法中的签名算法,从SHA256WithRSASHA1WithRSA。我也使用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发生了什么事,似乎该证书是存在的,但它不被正确映射:

Server Certificates

在上述连接中,图像的最上面的证书是被动态添加的证书,即我的文章中提到的证书。最后一个是通过IIS管理工具创建的示例自签名证书。

HTTPS Binding Details

以上链接的图像显示,HTTPS绑定和新创建的SSL证书之间的映射失败。

个人证书本地计算机下 - >个人:

该映像包含个人证书为根据本地计算机部分出现在证书管理器的列表。第一个是动态生成的,而第一个是使用IIS管理工具创建的。

Certificate Details

以上是自签名证书,证书的详细信息使用IIS管理工具(左侧)以及动态地生成一个(右侧)创建的。

一些他们两人之间最显着的区别是:

  1. 缺少密钥使用动态生成一个增强型密钥用法细节。
  2. 证书状态和图标表示存在错误。

所以问题是什么是错误的代码涉及创建自签名证书,导致映射到新的IIS网站失败?

谢谢

回答

2

将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(); 
+0

'X509KeyStorageFlags.MachineKeySet'是我的解决方案,谢谢! – 2017-05-19 12:30:39