2014-10-09 84 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