【问题标题】:Programmatically add binding on IIS 8 with SNI option使用 SNI 选项以编程方式在 IIS 8 上添加绑定
【发布时间】:2013-12-09 11:16:09
【问题描述】:

我正在尝试使用 Microsoft.Web.Administration 库 (.NET Framework) 为 IIS 8 创建已检查标志 SNI(服务器名称指示)的绑定。

这对我来说是必要的,因为我想在 IIS 下为同一个网站获取多个 SSL 绑定,所有这些都只使用一个 IP 地址。这是 IIS 8 的主要新功能之一。

我一直在研究 Binding 类,但找不到任何标志或选项来指示它。

当前的 Microsoft.Web.Administration v 7.0.0.0 是否可行? 我需要一个我还没有找到的新版本吗?

我知道版本 7.9.0.0 仅适用于 IIS express,这不是我的方案,所以我没有研究它。

【问题讨论】:

  • 更多幕后技术细节可以在blog.lextudio.com/2015/05/…找到无论你一开始使用哪种来源获取MWA程序集,你都应该坚持使用IIS附带的副本(就像你发现的那样最后)。

标签: .net iis iis-8 sni servermanager


【解决方案1】:

我终于设法使用文件夹 %windir%\system32\inetsrv\ 中的 Microsoft.Web.Administration 做到了这一点,但仅在带有 IIS 8 的 Windows 8/Windows 2012 中。

这些库在 BindingCollection 类的 Add 函数中有 SslFlags 选项。微软还没有关于这个新的重载的文档,或者至少我还没有找到它。

SslFlags.Sni 可用于此,并完美地创建与 SNI 检查的绑定。

【讨论】:

  • 现在有一个 NuGet 包(社区之一):nuget.org/packages/IIS.Microsoft.Web.Adminstration。不知道为什么 MS 不更新它。
  • @Mrchief,永远不要使用 NuGet 包。您的应用程序应始终引用安装在机器上 system32\inetsrv 下的版本,并且永远不要将其复制到本地。
  • @LexLi 不幸的是,practice 正在慢慢过时。 NuGet 包和本地副本(bin deployables)是前进的方向!
  • @Mrchief,“前进的道路”并不适用于 MWA,它是以依赖操作系统的方式设计的(不幸的是绑定到 COM)。 MWA 案例并非“过时”,而是设计使然,到目前为止,我没有看到此程序集有任何变化。
  • 前进方向的论点是 bin 可部署与机器可部署。官方 Nuget 包是为 IIS 7.x 管理而设计的,而我们现在有 IIS 10。无论如何,它已经相当过时了。
【解决方案2】:

当前的 Microsoft.Web.Administration v 7.0.0.0 是否可行?

确实如此,通过手动将SslFlags 属性添加到<binding> 节点:

Binding mySslBinding;
bool enableSni;

using (var serverManager = new ServerManager())
{
    // ... create or get value of mySslBinding...

    mySslBinding.SetAttributeValue("sslFlags", Convert.ToInt32(enableSni ? 1 : 0));

    serverManager.CommitChanges();
}

在此处查看SslFlags 的文档:https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/sites/site/bindings/binding

请注意,在任何 IIS 版本低于 8.0 的机器上执行上述代码都会导致 CommitChanges() 方法抛出异常,因为这些版本中不存在 sslFlags

警告:在现有绑定上启用 SNI 可能会导致其证书被取消选择!

另见Setting Server Name Indication (SNI) takes off certificate binding

要避免这个问题,你可以这样做:

var cert = mySslBinding.CertificateHash;
mySslBinding.SetAttributeValue("SslFlags", Convert.ToInt32(1));
mySslBinding.CertificateHash = cert;

【讨论】:

猜你喜欢
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2014-11-28
  • 2014-01-03
  • 2014-10-20
相关资源
最近更新 更多