在Windows 2012服务器上,我们使用C#代码创build网站。 这也适用于https绑定w / SSL。
出于某种原因,每当一个新的网站被创build,它将所有网站的SSL证书设置为“未选中” 是否有办法防止这种情况?
我们使用的代码
//get the server manager instance using (ServerManager mgr = new ServerManager()) { SiteCollection sites = mgr.Sites; Site site = mgr.Sites[siteName]; if (site != null) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = false; startInfo.UseShellExecute = false; startInfo.WorkingDirectory = @"C:\Windows\System32\Inetsrv"; startInfo.FileName = "appcmd.exe"; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.Arguments = string.Format("set site /site.name:\"{0}\" /+bindings.[protocol='https',bindingInformation='{1}:443:{2}']", siteName, ipAddress, hostHeader); using (Process exeProcess = Process.Start(startInfo)) { exeProcess.WaitForExit(); return true; } } else throw new Exception("Site: " + siteName + " does not exist."); }
假设appcmd与IIS7的交互方式与IIS7完全相同(还没有涉及到它),答案是否定的 。
在请求到达IIS之前,SSL终止在HTTP堆栈中处理。 出于这个原因,证书到端点的分配由操作系统处理,而不是由IIS处理。 appcmd.exe
只更新IISconfiguration文件,它不会与操作系统依赖关系(如证书分配)交互。
当您使用appcmd set site
您正在有效地重置/覆盖以前的网站configuration。
要更新证书到端点映射,您需要使用netsh.exe
如下所示: https : netsh.exe
-命令提示符
netsh http add sslcert ipport=0.0.0.0:443 certhash=baf9926b466e8565217b5e6287c97973dcd54874 appid={ab3c58f7-8316-42e3-bc6e-771d4ce4b201}
其中baf9926b466e8565217b5e6287c97973dcd54874
是证书指纹, 0.0.0.0
baf9926b466e8565217b5e6287c97973dcd54874
是IP端点( 0.0.0.0
表示与“任何未分配”相同)
更新:如果你总是使用HTTPS绑定的现有terminal(例如,总是“任何未分配”:443),我相信你可以通过备份下面的registry项(包括子项)来成功解决这个问题:
HKLM\SYSTEM\CurrentControlSet\services\HTTP\Parameters\SslBindingInfo
运行appcmd set site
后,将其重新写回registry