在 IIS 中部署 SSL
本文发布于 8 年前,部分内容可能已经失去参考价值。
上一篇介绍了如何创建用于 https 的 SSL 证书,本文讲述如何将创建好的 SSL 证书导入到 Windows,并在 IIS 中部署 HPPTS 的访问。
导入证书
GetSSL 整理的安装方法合集:https://www.getssl.cn/support/ssl安装教程/
下面介绍另一种方法:
准备好 pfx 格式的证书和密码。
开始 -> 运行 -> MMC
点击菜单栏的“添加/删除管理单元”,选择证书,添加,“本地计算机”或“计算机帐户”
左侧展开证书,个人,右键,所有任务,导入,键入密码,选择“根据证书类型,自动选择证书存储”
绑定网站域名
打开 IIS 管理器,选择相应的网站,“绑定”,添加,类型为“https”,选择证书
这样网站就能以 https:// 方式访问了
实现 http 自动跳转 https
方案一:推荐
打开 ASP.NET 网站,如果没有 Global.asax 则添加全局应用程序类
在 Application_BeginRequest() 方法中添加以下代码:
if (!Request.IsLocal && !Request.IsSecureConnection)
{
if (Request.HttpMethod == System.Net.WebRequestMethods.Http.Get || Request.HttpMethod == System.Net.WebRequestMethods.Http.Head)
{
Uri uri = Request.Url;
Response.Redirect("https://" + uri.Authority + uri.PathAndQuery + uri.Fragment);
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
Response.RedirectPermanent 是 301 永久
Response.Redirect 是 302 临时
Webform 貌似没有 303、307 的 Redirect,可以判断 Method 来分别处理。
MVC 中可以直接指定状态码,例:
public ActionResult About()
{
HttpContext.Response.AddHeader("Location", "/Home/Contact");
return new HttpStatusCodeResult(307);
}
方案二:
需要“URL 重写”支持,以 IIS 7 为例,模块下载地址:x86 / x64,IIS 8 及以上版本自带该模块
打开“URL 重写”,添加规则,选择空白规则
填写名称,如“Redirect to HTTPS”
与模式匹配,正则表达式
模式:(.*)
添加两个条件:
条件输入“{HTTPS}”,“与模式匹配”,模式“^OFF$”,确定
条件输入“{HTTPS_HOST}”,“与模式不匹配”,模式“^(localhost)”,确定
操作类型“重定向”,
重定向 URL“https://{HTTP_HOST}/{R:1}”
重定向类型:请参考此文,所有请求跳转可选 303,仅 GET/HEAD 请求跳转可选 307(推荐,可防止 POST 请求跳转丢失数据)
这么多步骤,其实最终会在网站 web.config 的 <system.webServer /> 节点下插入以下配置:
<rewrite>
<rules>
<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="(.*)"/>
<conditions>
<add input="{HTTPS}" pattern="^OFF$"/>
<add input="{HTTPS_HOST}" pattern="^(localhost)" negate="true"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Temporary"/>
</rule>
</rules>
</rewrite>
配置 Web.Release.config 转换语法
作为 ASP.NET 开发者,我们发现,当我们把这段 URL 重写规则复制到项目中的 web.config 后,在 VS 的本地调试中同样会自动跳转到 https://localhost/xxx,这可没法调试了呀。所以只能用 Web.Release.config 来实现本地调试用 http,发布用 https。
<system.webServer /> 节点是针对 IIS 7 的配置,干脆我把整个 <system.webServer /> 从 web.config 剪切到 web.release.config 中,然后给 <system.webServer> 加上属性和值:xdt:Transform="Insert",这样就能实现我们的目的了
详细的用于 Web 应用程序项目部署的 Web.config 转换语法参见此文
验证
最后我们来检查一下配置的对不对:https://www.geocerts.com/ssl_checker
参考资料