2011-02-22 37 views
11

所以Microsoft.Web.Administration API是非常容易使用创建HTTP和HTTPS绑定的网站:安装SSL证书编程方式使用Microsoft.Web.Administration

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(); 
} 

但HTTPS结合是相当没有SSL证书毫无意义。如何使用此API以编程方式选择证书文件并使用HTTPS绑定进行使用?

回答

7

有添加绑定,将正确的证书添加到HTTP.sys中的方法重载,请参阅:http://msdn.microsoft.com/en-us/library/bb355650(v=VS.90).aspx

可选实际上你可以设置绑定设置:

结合.CertificateHash和binding.CertificateStoreName并提交时它将正确注册HTTP.sys: http://msdn.microsoft.com/en-us/library/microsoft.web.administration.binding_properties(v=VS.90).aspx

+1

我知道这是一个老问题,但我已经注意到,如果我为绑定设置'CertificateHash'和'CertificateStoreName'值并调用'CommitChanges',一切都会成功,但绑定未设置。不知道为什么似乎发生。 – Fizz 2016-12-06 14:15:56

1

该命名空间不包含用于此的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(); 
+0

实际上发现API确实会处理它。看到这里:http://msdn.microsoft.com/en-us/library/bb355650(VS.90).aspx – 2011-03-03 00:30:55

+0

看起来像CarlosAg也有他的答案中的链接。 – 2011-03-03 00:32:02

4

方法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 
6

由于Helephant的答案是最好的,如果您需要证书散列(即在具有各种SSL证书的单台机器上的多个IP),您需要知道如何获得证书/散列。下面的几行代码演示了如何查找信息,,因为MSDN文档对于此主题非常糟糕。

您无法使用ServerManager.OpenRemote()远程更新SSL绑定 - 看起来这是一个错误。 Appcmd也不会帮助你。

如果你想一个字节的字符串转换回一个字节数组(如果你知道的哈希),here's how.

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:
www.awesomesite .com - cc2b5fc8216a949b58aadc21089c12b2c090f6bd

0

加入Taylo r 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绑定。

感谢Mr. Bird提供的WinAPI参考。

0

如果您在这里登陆并且想要使用PowerShell来完成此操作,我会提供一个相当完整的答案here。最简单的答案是,如果您知道要使用的证书的哈希值,请执行以下操作:

cd IIS:\SslBindings 
get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95 | New-Item 0.0.0.0!443