使用Microsoft.Web.Administration以编程方式安装SSL证书

因此, 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的Bindings,请参阅: 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(); } } 

输出示例:

MY:
http://www.awesomesite.com – cc2b5fc8216a949b58aadc21089c12b2c090f6bd

命名空间不包含此API,因此您必须使用其ConfigurationMethod来调用执行此function的Win API的扩展。 就像是:

 string certificateHash =  string certificateStore =  #my, localmachine, etc ConfigurationMethod method = binding.Methods["AddSslCertificate"]; ConfigurationMethodInstance mi = method.CreateInstance(); mi.Input.SetAttributeValue("certificateHash", certificateHash); mi.Input.SetAttributeValue("certificateStoreName", certificateStore); mi.Execute(); 

添加到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