动态添加具有指向动态生成的自签名证书的HTTPS绑定的网站

时间:2014-10-09 15:12:07

标签: c# iis-7 ssl-certificate x509certificate bouncycastle

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

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

Server Certificates

在上面链接的图片中,最顶层的证书是动态添加的证书,即我的帖子中提到的证书。最后一个是通过IIS管理工具创建的自签名证书示例。

HTTPS Binding Details

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

本地计算机下的个人证书 - &gt;个人:

此图像包含本地计算机部分下的证书管理器中的个人证书列表。最上面一个是动态生成的,而底部是使用IIS管理工具创建的。

Certificate Details

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

两者之间最显着的差异是:

  1. 在动态生成的内容中缺少密钥用法增强型密钥用法详细信息。
  2. 证书状态和表示存在问题的图标。
  3. 所以问题是涉及创建自签名证书的代码有什么问题,导致映射到新的IIS网站失败?

    由于

1 个答案:

答案 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();