我正在為測驗環境開發一個簡單的工具,我必須通過 C# 代碼設定幾十個站點。因此,我有一個陣列中的(子)域名(和其他屬性)串列,我遍歷它以創建帶有系結的站點。這作業正常,除了 HTTPS 系結,我需要從商店系結正確的 SSL 證書。無論出于何種原因,所有站點最終都會獲得相同的證書。
代碼比較簡單。我首先像這樣打開證書存盤:
var store = new X509Store("MY", StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
然后我為每個域找到Certificate.Subject.EndsWith(domain.Domain)也可以正常作業的證書。我顯示哈希和名稱,這些是正確的。
然后我繼續在埠 80 上創建具有基本系結的每個域:
var site = manager.Sites.Add(domain.Name, "http", $"*:80:{domain.Domain}", domain.Folder);
如果找到證書,我還將系結 HTTPS 連接:
site.Bindings.Add($"*:443:{domain.Domain}", domain.Certificate.GetCertHash(), "MY");
我還將哈希寫入控制臺,以確保我擁有正確的值!然后manager.CommitChanges();被呼叫以提交添加的站點。
然后我在 IIS 中檢查附加了哪個證書,結果是錯誤的!所以每個站點都有一個證書錯誤,我不明白為什么會出錯,因為一切似乎都是正確的。
因此,在提交后,我通過列舉到控制臺的系結再次列印哈希,它仍然顯示正確的哈希。這變得非常煩人!
至于確實被選中的證書......它似乎是我串列中最后一個域的證書。但是為什么它會被分配給所有其他系結呢?
這是 IIS 管理器中的錯誤嗎?
一個小發現:我去了 IIS 并將證書更改為正確的證書。這會在 IIS 中產生此訊息:
這很有趣,因為當我單擊“是”時,它將更改所有站點的證書。如果我單擊“否”,那么我將回傳到編輯對話框,因此無法解決任何問題。不過不要認為這有關系...

uj5u.com熱心網友回復:
笨蛋!笨蛋!啞的!解決了...
site.Bindings.Add($"*:443:{domain.Domain}", domain.Certificate.GetCertHash(), "MY", SslFlags.Sni);
最后是SslFlags.Sni標志,作為第 5 個引數,可以解決問題。它代表“服務器名稱指示”,呵呵!如果你通過域名系結證書,顯然你需要它......
這么小的事情可能會很煩人......
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/376368.html
