![](/img/trans.png)
[英]Microsoft.Web.Administration Ssl cert not selected in iis manager
[英]Install SSL certificate programmatically using Microsoft.Web.Administration
因此, Microsoft.Web.Administration API 非常易於用於為站點創建 HTTP 和 HTTPS 綁定:
using (ServerManager manager = new ServerManager())
{
Site site = manager.Sites[siteName];
site.Bindings.Clear();
site.Bindings.Add("*:80:", "http");
site.Bindings.Add("*:443:", "https");
manager.CommitChanges();
}
但是如果沒有 SSL 證書,HTTPS 綁定就毫無意義。 如何使用此 API 以編程方式選擇證書文件並將其與 HTTPS 綁定一起使用?
添加綁定的方法重載會將證書正確添加到 HTTP.sys,請參閱: http : //msdn.microsoft.com/en-us/library/bb355650( v=VS.90) .aspx
您可以選擇實際設置綁定設置:
binding.CertificateHash 和 binding.CertificateStoreName 並在提交時將正確注冊到 HTTP.sys: http : //msdn.microsoft.com/en-us/library/microsoft.web.administration.binding_properties (v=VS.90 )。 aspx
Bindings.Add()方法具有用於傳入 SSL 證書的重載。 如果您已經擁有 SSL 證書,您可以從 SSL 證書庫中選擇它,如下所示:
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
var certificate = store.Certificates.Find(X509FindType.FindByThumbprint, the thumbprint for the key", true);
var site = _mgr.Sites[name];
site.Bindings.Add("*:4043:", certificate[0].GetCertHash(), "MY");
運行代碼后,您可以通過從命令行運行它來檢查它是否有效:
netsh http show sslcert
如果您需要證書哈希(即具有各種 SSL 證書的單台機器上的多個 IP),Helephant 的答案是最好的,因此您需要知道如何獲取證書/哈希。 下面的幾行代碼演示了如何找出信息,因為 MSDN 文檔對於這個主題來說太差了。
您無法使用 ServerManager.OpenRemote() 遠程更新 SSL 綁定 - 這似乎存在錯誤。 Appcmd 也不會幫助你。
如果您想將字節字符串轉換回字節數組(如果您知道哈希值), 方法如下。
static void Main(string[] args)
{
var store2 = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
Console.WriteLine("TrustedPublisher:");
PrintCerts(store2);
Console.WriteLine();
Console.WriteLine("MY:");
store2 = new X509Store(StoreName.My, StoreLocation.LocalMachine);
PrintCerts(store2);
Console.WriteLine();
Console.WriteLine("CertificateAuthority:");
store2 = new X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine);
PrintCerts(store2);
Console.WriteLine();
}
static string PrintHash(byte[] cert)
{
StringBuilder builder = new StringBuilder();
foreach (byte b in cert)
{
builder.AppendFormat("{0:x2}", b);
}
return builder.ToString();
}
static void PrintCerts(X509Store store)
{
store.Open(OpenFlags.OpenExistingOnly);
foreach (var cert in store.Certificates)
{
Console.Write("{0} - {1}", cert.FriendlyName, PrintHash(cert.GetCertHash()));
Console.WriteLine();
}
}
示例輸出:
我的:
www.awesomesite.com - cc2b5fc8216a949b58aadc21089c12b2c090f6bd
命名空間不包含用於此的 API,因此您必須使用其ConfigurationMethod
調用執行此功能的 Win API 的擴展。 就像是:
string certificateHash = <hash>
string certificateStore = <storename> #my, localmachine, etc
ConfigurationMethod method = binding.Methods["AddSslCertificate"];
ConfigurationMethodInstance mi = method.CreateInstance();
mi.Input.SetAttributeValue("certificateHash", certificateHash);
mi.Input.SetAttributeValue("certificateStoreName", certificateStore);
mi.Execute();
我覺得在這個答案中強調 Devator 的評論很重要。 似乎存在阻止證書更改發生的錯誤,如果沒有看到此評論,我將永遠無法解決它。
如果將綁定信息設置為自身,這會導致 IIS 綁定證書。 下面顯示了一個快速示例:
binding.BindingInformation = binding.BindingInformation;
添加到 Taylor Bird 的評論中,但使用了 powershell:
...
Write-Verbose ("Remove old certificate [ {0} ]... " -f $SiteHttpsBinding.GetAttributeValue("certificateHash"))
$BindingMethod=$SiteHttpsBindings.Methods["RemoveSslCertificate"]
$BindingMethodInstance=$BindingMethod.CreateInstance()
$BindingMethodInstance.Execute()
Write-Verbose ("Add new certificate [ {0} ]..." -f $AfterThumbprint)
$BindingMethod=$SiteHttpsBindings.Methods["AddSslCertificate"]
$BindingMethodInstance=$BindingMethod.CreateInstance()
$BindingMethodInstance.Input.SetAttributeValue("certificateHash", $AfterThumbprint)
$BindingMethodInstance.Input.SetAttributeValue("certificateStoreName", "My")
$BindingMethodInstance.Execute()
...
上面的代碼片段對於更新證書很有用,而無需刪除整個綁定。 我用它來添加和更新本地和遠程機器上的 ssl 綁定。
感謝 Bird 先生提供 WinAPI 參考。
如果您來到這里並想使用 PowerShell 來完成此操作,我在此處提供了一個相當完整的答案。 最簡單的答案是,如果您知道要使用的證書的哈希值,請執行以下操作:
cd IIS:\SslBindings
get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95 | New-Item 0.0.0.0!443
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.