好记性不如烂博客发现-分享-成就

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,安装时会提示。

    官方网址:http://certify.webprofusion.com/

  • 第一次启动程序时会弹出对话框让我们填写个邮箱地址,等证书快要过期的时候我们会收到续订证书的提醒邮件。
  • 点击“新建证书”按钮,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。或通过下面的链接直接下载:

2.0版32位:http://download.microsoft.com/download/4/9/C/49CD28DB-4AA6-4A51-9437-AA001221F606/rewrite_x86_zh-CN.msi

2.0版64位:http://download.microsoft.com/download/4/E/7/4E7ECE9A-DF55-4F90-A354-B497072BDE0A/rewrite_x64_zh-CN.msi

2.1版32位:https://download.microsoft.com/download/D/8/1/D81E5DD6-1ABB-46B0-9B4B-21894E18B77F/rewrite_x86_zh-CN.msi

2.1版64位:https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi

在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)

HTTP重定向到HTTPS

完成配置后,会发现盘诚网站的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跳转方式来实现由HTTPHTTPS的跳转,但是这个过程总是会使用到HTTP,因此容易发生劫持,且易受到第三方的攻击。为了解决这个问题,就需要用到HSTSHTTP严格安全传输)。

一、HSTS介绍

1.HSTS 简介

  • HSTSHTTP 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:完美支持
  • SafariSafari 7起开始支持(2013年)
  • IEIE11起开始支持(包括后面的Edge
  • Opera:完美支持

(2)移动设备

  • iOSiOS 7.1起开始支持
  • AndroidAndroid 4.4起开始支持

二、HSTS部署

1.操作步骤

(1)由于HSTS策略只能在HTTPS响应中进行设置,所以首先我们还是要做个httphttps的重定向。让用户第一次访问的时候会自动跳转到https地址上。

(2)接着我们要开启IISHSTS功能。打开网站目录下的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>

HttpOutboundRules

三、HSTS 预载入列表(HSTS Preload List)

虽然HSTS可以很好的解决HTTPS降级攻击,但是对于HSTS生效前的首次HTTP请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了HSTS Preload List方案。

1.HSTS Preload List 介绍

  • 浏览器内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用HTTPS协议。
  • 目前这个Preload ListGoogle Chrome维护,ChromeFirefoxSafariIE 11Microsoft Edge都在使用。

2.加入条件

如果要想把自己的域名加进这个预载入列表,需要满足以下条件:

(1)提供有效的证书。

(2)将所有HTTP流量重定向到HTTPS

(3)确保所有子域名都启用了HTTPS,特别是www子域。

(4)输出HSTS响应头:

  • max-age至少需要1年(31536000 秒)。
  • 必须指定includeSubdomains参数;
  • 必须指定preload参数;
  • 如果您正在从HTTPS站点提供额外的重定向,则该重定向必须仍具有HSTS标头(而不是其重定向到的页面)。

3.加入方法

当上面的条件满足后,我们可以通过下面这个地址申请加入预载入列表,或进行状态查询。

注意:

  • 即便满足了上述所有条件,也不是一定就能进入HSTS Preload List
  • 提交的申请并不是自动处理的,人工处理也许需要一周到几周。
  • 即便你已经列入到这个列表,但是依旧需要几个月才能逐渐从Chromecanary更新通道更新到devbeta等通道,直到最后的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.解决办法

  1. 虽然我们可以通过修改注册表的方法启用TLS1.2,但略显麻烦,而且不一定成功。这里推荐一款软件:IISCrypto

下载地址https://www.nartac.com/Products/IISCrypto

  1. 程序启动后,我们勾选上TLS 1.2,以及右下的reboot,然后点击Apply按钮,这时服务器会自动重启。
  2. 重启后再次检测,可以发现网站已经从TLS 1.0升级到了TLS 1.2了。
  3. 此时,如果去跑分应该是不错的了。如果还没有到A,那么还有大神分享的更严格和安全的设置模板。下载后,在IISCryptoTemplates中导入并应用即可。

开源地址:https://github.com/stylersnico/IIS-10-Secure-TLS
跑分链接:https://wosign.ssllabs.com/

  1. 如果要跑分到 A+,那么 HSTS 是必不可少的。可以进入网站你的域名HTTP 相应标头— 添加

名称: Strict-Transport-Security
项值:max-age=15768000; includeSubDomains; preload