在 Windows 2012 服务器上,我们使用 C# 代码创建网站。这也适用于带 SSL 的 https 绑定。
由于某种原因,每当创建新网站时,它都会设置全部网站的 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.");
}
答案1
假设 appcmd 与 IIS8 的交互方式与 IIS7 完全相同(尚未研究过),答案是不。
SSL 终止在请求到达 IIS 之前在 HTTP 堆栈中处理。因此,证书到端点的分配由操作系统处理,而不是由 IIS 处理。appcmd.exe
仅更新 IIS 配置文件,它不会与操作系统依赖项(如证书分配)交互。
当您使用时,appcmd set site
您实际上是在重置/覆盖以前的站点配置。
要更新证书到端点映射,您需要netsh.exe
按照以下步骤使用:https://stackoverflow.com/questions/591597/how-to-assign-a-ssl-certificate-to-iis7-site-from-command-prompt
netsh http add sslcert ipport=0.0.0.0:443 certhash=baf9926b466e8565217b5e6287c97973dcd54874 appid={ab3c58f7-8316-42e3-bc6e-771d4ce4b201}
其中,baf9926b466e8565217b5e6287c97973dcd54874
是证书指纹,0.0.0.0:443
是 IP 端点(0.0.0.0
与“任何未分配”的含义相同)
更新: 如果您始终使用现有端点进行 HTTPS 绑定(例如始终“任何未分配”:443),我相信您可以通过备份以下注册表项(包括子项)成功克服此问题:
HKLM\SYSTEM\CurrentControlSet\services\HTTP\Parameters\SslBindingInfo
运行后将其写回注册表appcmd set site