1

我正在开发一个用于测试环境的简单工具,我必须通过 C# 代码设置几十个站点。因此,我在一个数组中有一个(子)域名(和其他属性)的列表,我通过它来创建具有它们的绑定的站点。这工作正常,除了我需要从商店绑定正确的 SSL 证书的 HTTPS 绑定。无论出于何种原因,所有站点最终都会获得相同的证书。
代码相对简单。我首先像这样打开证书存储:

var store = new X509Store("MY", StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);

然后,我为每个域找到Certificate.Subject.EndsWith(domain.Domain)也可以正常工作的证书。我显示哈希和名称,这些都是正确的。
然后我继续在端口 80 上创建具有基本绑定的每个域:

var site = manager.Sites.Add(domain.Name, "http", $"*:80:{domain.Domain}", domain.Folder);

如果找到证书,我还将绑定 HTTPS 连接:

site.Bindings.Add($"*:443:{domain.Domain}", domain.Certificate.GetCertHash(), "MY");

我还将哈希写入控制台只是为了确保我有正确的值!然后manager.CommitChanges();被调用以提交添加的站点。
然后我在 IIS 中检查附加了哪个证书,结果证明是错误的!所以每个站点都有一个证书错误,我不明白为什么会出错,因为一切似乎都是正确的。
因此,在提交之后,我通过枚举到控制台的绑定再次打印散列,它仍然显示正确的散列。这变得非常烦人!
至于确实被选中的证书......它似乎是我列表中最后一个域的证书。但是为什么它被分配给所有其他绑定呢?
这是 IIS 管理器中的错误吗?


一个小发现:我去了 IIS 并将证书更改为正确的证书。这会导致 IIS 中出现此消息: 这很有趣,因为当我单击“是”时,它将更改所有站点的证书。如果我单击“否”,那么我将返回编辑对话框,这样就不会解决任何问题。不要以为这有关系,虽然...
手动更改证书后 IIS 中的警告...

4

1 回答 1

0

杜!杜!哑的!解决了...

site.Bindings.Add($"*:443:{domain.Domain}", domain.Certificate.GetCertHash(), "MY", SslFlags.Sni);

最后是SslFlags.Sni标志,作为第 5 个参数,可以解决问题。它代表“服务器名称指示”,呵呵!如果你通过域名绑定证书显然你需要它......
这样一件小事可能会很烦人......

于 2021-12-03T14:44:38.720 回答