如何通过代码将现有的SSL证书分配给新的IIS站点?

nle07wnf  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(48)

我正在为一个测试环境开发一个简单的工具,在这个测试环境中,我必须通过C#代码建立几十个站点(和其他属性)在数组中,我运行它来创建具有绑定的站点。这很好,除了HTTPS绑定,我需要从商店绑定适当的SSL证书。无论出于何种原因,所有站点最终都具有相同的证书。
代码相对简单。我首先打开证书存储,如下所示:

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管理器中的一个bug吗?
一个小发现:我去了IIS并将证书更改为正确的证书。这导致IIS中出现以下消息:
x1c 0d1x的数据
这很有趣,因为当我点击“是”时,它将更改所有网站的证书。如果我点击“否”,那么我将返回编辑对话框,因此这并不能解决任何问题。不要认为这是相关的,虽然.

7rfyedvj

7rfyedvj1#

傻!解决了……

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

字符串
最后是 SslFlags.Sni 标志,作为第五个参数,它代表“服务器名称指示”,duh!显然,如果您通过域名绑定证书,您需要它...
这么一点小事,都能让人如此烦恼……

jckbn6z7

jckbn6z72#

您需要确保在绑定屏幕中选中了RequireservernameIndication。


的数据

相关问题