IIS部署SSL证书并实现强制HTTPS访问
首先,实现HTTPS
一、HTTPS 协议介绍
1.什么是 HTTPS 协议?
- HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,即 HTTP 的安全版。
- 简单来说HTTPS就是在HTTP上面加了一层SSL协议。我们可以在HTTP站点上部署SSL数字证书将其变成HTTPS。
- 对用户来说,最直观的表现就是当访问HTTPS站点时,可以看到在地址栏里有一个小绿锁图标,表明当前网站使用HTTPS协议。
2.为什么要使用 HTTPS 协议
- 通过加密通讯连接,可以保证数据传输的安全,这点在交易支付方面尤为重要。虽然SSL并不是无懈可击的,但是这样做起码可以提高窃听成本。
- 使用了HTTPS之后,如果网站的访客是从其他已经使用了HTTPS的网站上跳转过来,你就能在 Google Analytics 中获取更完整的来源信息。
- 如果你要部署发布一个 iOS 企业应用,那么下载服务器就必须使用HTTPS协议。
3.如何使用 HTTPS 协议
- 目前想在 web 上使用 HTTPS 的话。你首先需要获得一个 SSL 证书文件,该证书由一个受浏览器信任的公司所签署。
- 获得证书以后,你需要在你的 web 服务器上指定其所在的位置,以及与你关联的私钥的位置,并开启 443 端口准备使用。
二、Let's Encrypt 介绍
1.基本介绍
- Let's Encrypt是国外一个公共的免费 SSL 项目,由 ISRG 联手组成证书颁发机构,可以签发免费 SSL/TLS 证书。
ISRG(Internet Security Research Group,互联网安全研究小组)是一个关注网络安全的公益组织,其赞助商从非商业组织到财富100强公司都有,包括 Mozilla,Akamai,思科,Facebook,密歇根大学等等。
- Let,s Encrypt是为普及 HTTPS 而发起的,它推动了基础 DV SSL 证书的普及。其证书已经被 Mozilla、Google、Microsoft 和 Apple 等主流浏览器支持,只需要 web 服务器配置好 HTTPS 证书,浏览器会在加载时验证 web 服务器 HTTPS 证书是否有效。
- 随着 HTTPS 的普及,Let’s Encrypt 目前已成为全球最受欢迎的免费 SSL 证书签发机构。
2.使用优点
- 完全免费,避免 ISP 劫持
- 申请速度快、无需注册账户
3.注意事项
- Let's Encrypt 的基础 DV SSL 证书,只提供了数据加密,不验证身份,无法向用户证明网站的所有者。即使这样,也满足了基本需要了。
- 它一次只会颁发 3 个月有效期的证书,到期之后需要自己再续上(仍然是免费的)。不过,我们可以自己写定时脚本任务或者使用工具来自动续约。
三、使用 Certify 来自动申请并配置证书
1.Certify 介绍
- Certify 是一个可以自动续订 Let's Encrypt 颁发证书的第三方 GUI 软件(图形界面工具)。
- 使用它可以自动配置、创建和自动续订证书,并且到快要续订的时候会自动发邮件通知我们。
2.使用步骤
- 首先将 Certify 下载到服务器上并安装。注意其依赖 Microsoft .NET Framework 4.5,安装时会提示。
- 第一次启动程序时会弹出对话框让我们填写个邮箱地址,等证书快要过期的时候我们会收到续订证书的提醒邮件。
- 点击“新建证书”按钮,certify 会自动扫描 IIS 中的站点,选择我们要申请证书的域名。完毕后点击“保存”按钮进行保存。
- 保存后点击“请求证书”按钮获取证书。
- 在申请的同时,Certify 会在网站根目录下生成.well-known文件夹,并自动配置web.config,自动验证证书。
- 待其执行完毕后,返回 Certify 的首页面可以看到站站点已经成功使用了 Let's Encrypt 的证书了。
- 可以把网站根目录下之前自动创建的.well-known目录给删掉,以保持网站目录干净。
3.测试检查
- 使用浏览器访问盘诚网站:https://www.panson.cn,可以看到地址栏前面带了小绿锁,说明SSL证书已经成功配置。
- 打开 IIS 可以看到 SSL 证书确实已经自动配置好了。
其次,重定向到HTTPS
安装并配置URL Rewrite 组件
一、安装URL重写模块
关于URL Rewrite 组件,可以访问网址:https://www.iis.net/downloads/microsoft/url-rewrite
从微软的官方网站下载URL Rewrite 2.0组件,对应64位的网址:https://www.microsoft.com/zh-cn/download/details.aspx?id=7435。或通过下面的链接直接下载:
在Windows Server 2016的IIS10中安装URL Rewrite 2.0组件会提示错误,解决方法是:
运行Regedit打开注册表,找到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ InetStp项,编辑“MajorVersion”并将十进制数值改为9,然后安装URL Rewrite 2.0组件。待组件安装完毕,再将“MajorVersion”数值改为10。
二、设置HTTP自动重定向HTTPS
为了让访问 http 链接时,自动跳转到对应的 https 链接上,需要在配置文件中进行URL重定向配置。在IIS控制台中找到“URL重写”组件,在右边窗体中选择“添加规则”并添加一个空白规则,然后对这条规则进行相关配置。
Name:RedirectToHTTPS(自己随意起)
Pattern:(.*)
Conditions:新增一个条件。Input 为 {HTTPS},Pattern 为 ^OFF$
Redirect URL:https://{HTTP_HOST}/{R:1}
Redirect type:Permanent (301)
完成配置后,会发现盘诚网站的web.config配置文件中增加以下配置节。实际上,将下节信息复制到web.config中,是可以快速完成配置的,免去窗口配置的麻烦。
<system.webServer>
<rewrite>
<rules>
<rule name="RedirectToHTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
再者,强制跳转HTTPS
开启HSTS让浏览器默认以HTTPS访问
盘诚网站部署SSL证书并配置URL重写组件(实现HTTP重定向到HTTPS)后,不管用户输入的是哪种地址,最终会跳转到HTTPS上。然后,这样做,还是存在一个问题。由于采用的是301/302跳转方式来实现由HTTP到HTTPS的跳转,但是这个过程总是会使用到HTTP,因此容易发生劫持,且易受到第三方的攻击。为了解决这个问题,就需要用到HSTS(HTTP严格安全传输)。
一、HSTS介绍
1.HSTS 简介
- HSTS(HTTP Strict Transport Security)是国际互联网工程组织IETF发布的一种互联网安全策略机制。
- 采用HSTS策略的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址,从而减少会话劫持风险。
2.HSTS 原理
HSTS主要是通过服务器发送响应头的方式来控制浏览器操作:
- 当客户端通过HTTPS发出请求时,服务器会在返回的HTTP响应头中包含Strict-Transport-Security字段。
- 浏览器接收到这样的信息之后,在一定期限内对该网站的任何请求都会以HTTPS发起,而不会以HTTP发起再由服务器重定向到HTTPS。
3.HSTS 响应头格式
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
参数说明:
- max-age(单位是秒):用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。
- includeSubDomains(可选参数):如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。
- preload(可选参数):一个浏览器内置的使用HTTPS的域名列表。
4.浏览器支持情况
(1)桌面浏览器
- Chrome:完美支持
- Firefox:完美支持
- Safari:Safari 7起开始支持(2013年)
- IE:IE11起开始支持(包括后面的Edge)
- Opera:完美支持
(2)移动设备
- iOS:iOS 7.1起开始支持
- Android:Android 4.4起开始支持
二、HSTS部署
1.操作步骤
(1)由于HSTS策略只能在HTTPS响应中进行设置,所以首先我们还是要做个http到https的重定向。让用户第一次访问的时候会自动跳转到https地址上。
(2)接着我们要开启IIS的HSTS功能。打开网站目录下的web.config这个文件,在相应的位置添加上针对https响应的url重写规则(高亮部分),并保存。
- max-age我们这里设置为365天。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<defaultDocument>
<files>
<add value="index.php" />
</files>
</defaultDocument>
<staticContent>
<remove fileExtension=".htm" />
<remove fileExtension=".html" />
<mimeMap fileExtension=".html" mimeType="text/html;charset=utf-8" />
<mimeMap fileExtension=".htm" mimeType="text/html;charset=utf-8" />
<mimeMap fileExtension=".mp4" mimeType="application/octet-stream" />
</staticContent>
<rewrite>
<rules>
<rule name="redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
<match serverVariable="RESPONSE_Strict_Transport_Security"
pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" ignoreCase="true" />
</conditions>
<action type="Rewrite" value="max-age=31536000" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
<location path="favicon.ico">
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="31.00:00:00" />
</staticContent>
</system.webServer>
</location>
</configuration>
三、HSTS 预载入列表(HSTS Preload List)
虽然HSTS可以很好的解决HTTPS降级攻击,但是对于HSTS生效前的首次HTTP请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了HSTS Preload List方案。
1.HSTS Preload List 介绍
- 浏览器内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用HTTPS协议。
- 目前这个Preload List由Google Chrome维护,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。
2.加入条件
如果要想把自己的域名加进这个预载入列表,需要满足以下条件:
(1)提供有效的证书。
(2)将所有HTTP流量重定向到HTTPS。
(3)确保所有子域名都启用了HTTPS,特别是www子域。
(4)输出HSTS响应头:
- max-age至少需要1年(31536000 秒)。
- 必须指定includeSubdomains参数;
- 必须指定preload参数;
- 如果您正在从HTTPS站点提供额外的重定向,则该重定向必须仍具有HSTS标头(而不是其重定向到的页面)。
3.加入方法
当上面的条件满足后,我们可以通过下面这个地址申请加入预载入列表,或进行状态查询。
注意:
- 即便满足了上述所有条件,也不是一定就能进入HSTS Preload List。
- 提交的申请并不是自动处理的,人工处理也许需要一周到几周。
- 即便你已经列入到这个列表,但是依旧需要几个月才能逐渐从Chrome的canary更新通道更新到dev、beta等通道,直到最后的stable通道。
4.请确定是否要加入
如果你并不能确定你的网站从此以后一直使用HTTPS,那还是不要加入的好。因为,加入后很难撤销,你可以要求撤销,但是这个数据重新更新到稳定版的Chrome同样需要几个月,而别的浏览器是如何处理这个撤销数据的,则无法保证。
换句话说,只有HTTPS骨灰粉才应该考虑加入。
最后,HTTPS 跑分到 A+
启用 TLS 1.2 教程
1.问题描述
- 盘诚网站使用Certify来自动申请,并配置Let's Encrypt颁发的SSL证书,实现了HTTPS访问。但最近使用Chrome浏览器访问提示有安全隐患,说网站的TSL版本过时,需要启用TSL1.2或更高版本。
- 使用在线SSL安装检测工具(https://www.getssl.cn/sslchecker)进行检查,可以看到网站目前确实不支持的TLS1.2。
2.解决办法
- 虽然我们可以通过修改注册表的方法启用TLS1.2,但略显麻烦,而且不一定成功。这里推荐一款软件:IISCrypto
- 程序启动后,我们勾选上TLS 1.2,以及右下的reboot,然后点击Apply按钮,这时服务器会自动重启。
- 重启后再次检测,可以发现网站已经从TLS 1.0升级到了TLS 1.2了。
- 此时,如果去跑分应该是不错的了。如果还没有到A,那么还有大神分享的更严格和安全的设置模板。下载后,在IISCrypto的Templates中导入并应用即可。
开源地址:https://github.com/stylersnico/IIS-10-Secure-TLS
跑分链接:https://wosign.ssllabs.com/
- 如果要跑分到 A+,那么 HSTS 是必不可少的。可以进入网站—你的域名—HTTP 相应标头— 添加
名称: Strict-Transport-Security
项值:max-age=15768000; includeSubDomains; preload