Iis

具有 IIS 的同一伺服器上的 SNI 和萬用字元 SSL 證書

  • November 11, 2014

我想託管一個網站,該網站應該監聽子域(例如 sub.domain.com)以及多個網站,這些網站使用 IIS 和 SSL 位於二級域(例如 domain2.com、domain3.com)下。

對於具有子域的網站,我有一個萬用字元證書 (*.domain.com),我也有專門用於其他網站的證書(domain2.com 和 domain3.com)。

這樣的設置是否可以託管在同一個 IIS 上(如果重要,在 Azure 雲服務 Web 角色中)?

問題正是 titobf在這裡解釋的:理論上,為此我們需要使用 SNI 進行綁定,為 domain2/3.com 指定主機,然後為 *.domain.com 指定一個包含 * 主機的包羅萬象的網站。但在實踐中,無論如何設置綁定,如果萬能網站在它上面,它也會接收到 domain2/3.com 的所有請求(儘管據說它只是作為最後的手段才匹配)。

任何幫助,將不勝感激。

仍未解決

不幸的是,我無法解決這個問題:它似乎只能以極其複雜的方式解決,比如創建一個位於 IIS 和網際網路之間的軟體(基本上是一個防火牆)並修改傳入的請求(在 SSL 握手發生之前! ) 以允許該場景。我相當有信心這對於 IIS 是不可能的,無論如何,即使是本機模組也不可能。

我必須澄清一下:我們使用 Azure 雲服務,因此我們有一個進一步的限制,即我們不能使用多個 IP 地址(請參閱:http: //feedback.azure.com/forums/169386-cloud-services-web-and -worker-role/suggestions/1259311-multiple-ssl-and-domains-to-one-app )。如果您可以將多個 IP 指向您的伺服器,那麼您就不會遇到此問題,因為您也可以為 IP 創建綁定,並且這些綁定將與萬用字元綁定一起使用。更具體地說,您需要一個用於萬用字元站點的 IP(但由於您現在有一個單獨的 IP,因此您不必配置萬用字元主機名綁定)和所有其他非萬用字元站點的另一個 IP。

實際上,我們的解決方法是使用非標準 SSL 埠 8443。因此 SNI 綁定實際上綁定到此埠,因此它與其他綁定一起工作。不好,但對我們來說是一種可接受的解決方法,直到您可以將多個 IP 用於 Web 角色。

現在的非工作綁定

第一個 https 綁定是帶有簡單證書的 SNI,第二個不是 SNI,帶有萬用字元證書。

http 站點和 SNI https 站點一樣有效,但是帶有萬用字元綁定的站點會給出“HTTP 錯誤 503。服務不可用”。(沒有任何進一步的資訊,沒有失敗的請求跟踪或事件日誌條目)。 綁定

終於讓它基本上工作了

像 Tobias 描述的那樣啟用 ETW 跟踪日誌表明根本錯誤如下:

請求(請求 ID 0xF500000080000008)被拒絕,原因是:UrlGroupLookupFailed。

據我了解,這意味著 http.sys 無法將請求路由到任何可用的端點。

檢查已註冊的端點netsh http show urlacl表明確實有為埠 443 註冊的東西:

Reserved URL            : https://IP:443/
   User: NT AUTHORITY\NETWORK SERVICE
       Listen: Yes
       Delegate: No
       SDDL: D:(A;;GX;;;NS)

刪除它netsh http delete urlacl url=https://IP:443/最終啟用了我的 SSL 綁定。

巴里斯是對的!在 IP:PORT 綁定(例如:100.74.156.187:443)上配置的 SSL 證書在 http.sys 中始終優先!所以解決方法如下:

不要為您的 wildcard-fallback-certificate 配置 IP:443 綁定,而是為其配置 :443 綁定( 表示“所有未分配”)

如果您在 Azure 雲服務 SSL 端點上配置了萬用字元證書(就像我一樣),您必須將 Azure 雲服務執行時 (IISconfigurator.exe) 創建的 SSL 綁定從 IP:PORT 更改為 :PORT。我在我的網路角色的OnStart中呼叫以下方法:*

public static void UnbindDefaultSslBindingFromIp()
{
   Trace.TraceInformation(">> IISTenantManager: Unbind default SSL binding from IP");
   using (var serverManager = new Microsoft.Web.Administration.ServerManager())
   {
       try
       {
           var websiteName = string.Format("{0}_Web", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CurrentRoleInstance.Id);
           var site = serverManager.Sites[websiteName];
           var defaultSslBinding = site.Bindings.Single(b => b.IsIPPortHostBinding && b.Protocol == "https");
           defaultSslBinding.BindingInformation = string.Format("*:{0}:", defaultSslBinding.EndPoint.Port);
           serverManager.CommitChanges();
       }
       catch (Exception ex)
       {
           Trace.TraceError(ex.ToString());
       }
   }
}

以下螢幕截圖顯示了我們雲服務的工作配置。請不要對非標準埠感到困惑。螢幕截圖來自模擬的雲服務。

工作 IIS 配置

還要提一件事:不要將所有綁定更改為 *,因為 HTTP(埠 80)綁定僅適用於部署的雲服務中的 IP:PORT 綁定。其他東西綁定到 IP:80,所以 *:80 不起作用,因為 * 代表“所有未分配”,並且 IP 已經在 http.sys 中的其他位置分配。

引用自:https://serverfault.com/questions/579109