簡體   English   中英

使用 Microsoft.Web.Administration 以編程方式安裝 SSL 證書

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM