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

Ben*_*key 12 c# iis 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();
}
Run Code Online (Sandbox Code Playgroud)

但是没有SSL证书,HTTPS绑定就没有意义了.如何使用此API以编程方式选择证书文件并将其与HTTPS绑定一起使用?

Car*_*res 7

有一个方法重载,用于添加将正确添加证书到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

  • 我知道这是一个老问题,但我注意到如果我为绑定设置`CertificateHash`和`CertificateStoreName`值并调用`CommitChanges`,一切都应该成功,但绑定没有设置.不知道为什么会出现这种情况. (5认同)
  • @Fizz:我不得不手动设置`binding.BindingInformation = binding.BindingInformation;`(即使它看起来没有意义,这会导致IIS实际绑定证书). (5认同)

Hel*_*ant 7

所述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");
Run Code Online (Sandbox Code Playgroud)

运行代码后,可以通过命令行运行代码来检查代码是否有效:

netsh http show sslcert
Run Code Online (Sandbox Code Playgroud)


Chr*_*s S 7

如果你需要证书哈希值(即在具有各种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();
    }
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

MY:
www.awesomesite.com - cc2b5fc8216a949b58aadc21089c12b2c090f6bd