从 HTTP 到 HTTPS - IIS 部署免费 HTTPS

2019-04-10 08:53:08来源: 听说 阅读 ()

新老客户大回馈,云服务器低至5折

HTTP

当你在浏览器输入一个网址 (例如 http://tasaid.com)的时候,浏览器发起一个 HTTP 请求,带着请求信息 (参见 HTTP Headers),连接到服务器,把请求信息递给服务器,服务器收到信息之后,解析相关的信息,然后进行处理,再返回浏览器请求的数据。

简单来说是这么一个流程:

  1. 小明浏览器爸爸 说我想要去中关村某个店家拿一些东西 (发起请求)

  2. 浏览器爸爸 就把 小明 要的东西记在一张清单上 (生成HTTP协议)

  3. 然后 浏览器爸爸 派出一个 线程小弟,噌噌噌跑到中关村的店里,把清单递给 店家,说小明要这些东西 (进行传输)

  4. 店家线程小弟 稍等,然后去屋子里面拿小明的这些东西 (服务器收到请求)

  5. 店家 把东西拿出来后,并且也打印了一份清单,让 线程小弟 带着清单和东西一起拿回去 (服务器处理请求完毕)

  6. 然后 线程小弟 回到 浏览器爸爸 那边,把服务器给的清单和物品交给浏览器爸爸,浏览器爸爸根据清单核对物品 (浏览器处理响应)

  7. 然后把物品打包交给了 小明 (浏览器渲染并呈现界面)

看图说话:

这其中有个问题,浏览器爸爸和服务器都没有验证清单信息的有效性和对方的身份。万一有人在中间把线程小哥拦下来,暴揍一顿,然后把物品清单给换了怎么办?或者有人把线程小哥在半路上暴揍一顿,拿了清单换了另外一个小哥怎么办?

这是个很严肃的问题:假如服务器要把一些东西锁在柜子里,需要小明给密码才可以打开柜子。然后小明把密码写在清单上让浏览器爸爸交给服务器。这时候,如果这张清单被人拦截下来,不就得到了小明的密码?

简单来说,传输的信息中包含用户密码,被拦截了怎么办?

HTTPS

正因为HTTP请求有这些安全性的问题,所以HTTPS诞生了,致力于解决了这些安全性问题,我们进行一下对比:

那么HTTPS是如何做到更安全的呢?

简单来说,HTTPS 即是在 HTTP 下加入了一层 SSL 加密,所以被称为HTTPS。具体的加密过程则是 公匙加密法:

  • 客户端向服务器索要公匙,然后使用公匙加密信息

  • 服务器收到加密后的信息,用自己的私匙解密

公匙密码和算法都是公开的,而私匙则是保密的。加密使用的公匙和解码使用的密匙都是不相同的,因此这是一个 非对称加密 算法。

数字证书

提及 HTTPS ,就会听到大家说需要证书才能部署,那么什么是证书呢?

因为互联网不安全,公匙也是信息的一部分,也是会有被篡改的风险的。所以引入了互联网权威机构 - CA 机构,又称为证书授权 (Certificate Authority) 机构,浏览器会内置这些"受信任的根证书颁发机构" (即 CA)。

服务端向权威的身份鉴定 CA 机构申请数字证书,CA 机构验证了网站之后,会把网站录入到内部列表,采用 Hash 把服务端的一些相关信息生成摘要,然后 CA 机构用自己的私匙,把服务端的公匙和相关信息一起加密,然后给申请证书的服务端颁发数字证书,用于其他客户端 (比如浏览器) 认证这个网站的公匙。

客户端通过服务端下发的证书,找到对应的 CA,然后向 CA 验证这个证书是否有效,CA 验证通过之后,下发服务端的公匙。

因为 CA 是权威并且可信的,所以客户端 (浏览器) 信任 CA,而 CA 又信任经过认证的服务端 ,所以客户端 (浏览器) 也信任这个服务端,这就是信任链 (Chain Of Trust)。

而 CA 颁发的数字证书,一般包含这些信息:

简单来说:为了保证公匙是安全的,所以通过数字证书验证公匙。

加密通信

一条完整的HTTPS请求应该是这样的:

  1. 客户端 (浏览器) 发起 HTTP 请求,请求连接服务端,发送支持的加密通信协议 (和版本),并且生成一个随机数,后续用于生成"对话密钥"。

  2. 服务端确认加密通信协议 (和版本),同时也生成一个随机数,后续用于生成"对话密匙",并且将 CA 颁发的数字证书,一起发送给客户端。

  3. 客户端收到数字证书后,检测内置的"受信任的根证书颁发机构",查看解开数字证书的公匙是否在。

  4. 如果解开数字证书的公匙存在,则使用它解开数字证书,得到正确的服务器公匙,同时再次生成一个随机数,用于服务器公匙加密,并发送给服务器。

  5. 此时本地和服务器同时将三个随机数,根据约定的加密方法进行加密,各自生成本次会话的所使用的同一把 "会话密匙" 。

  6. 到这里,认证阶段已经完毕,数据传输从 非对称加密 换成了 对称加密 (因为考虑到性能),接下来所有的数据传输都是使用HTTP协议进行传输,只不过使用了 "会话密匙" 来加密内容。

见下图:

有哪些免费证书

这里只介绍在 TaSaid.com 部署 HTTPS 中尝试的免费证书方案,部署在 IIS8 上。

  • Let's Encrypt

  • 沃通 (wosign) (不推荐)

本来在 TaSaid.com 迁移中尝试部署过沃通 (wosign) 的签发的免费证书,但是后来发现了 Mozilla 官网( firefox/火狐 背后的开源组织 ) 里列出了 沃通的一系列可疑行为和问题,并且沃通 "秘密" 收购 StartCom(著名的免费 HTTPS 证书 StartSSL 即其旗下产品)行为可疑, Mozilla 基金会正在考虑对沃通以及 StartCom 这两个 CA 机构一年内新签发的所有 SSL 证书进行封杀。

我在上一篇文章 《从 HTTP 到 HTTPS - 什么是 HTTPS》 中指出 CA 机构应该是是权威和可信的,但由于沃通当前的陷入的一系列丑闻,信任度降低,所以暂时不推荐使用沃通。并且沃通官网已暂时关闭免费 HTTPS 证书申请。

这一段内容发表于2016年10月5日,如果您在未来某天阅览到这个内容,请即时更新了解沃通最新的动态。

所以我们这次仅推荐 Let's Encrypt。

Let's Encrypt

推荐 Let's Encrypt 理由:

  • 由 ISRG(Internet Security Research Group,互联网安全研究小组)提供服务,而 ISRG 是来自于美国加利福尼亚州的一个公益组织。Let's Encrypt 得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等众多公司和机构的支持,发展十分迅猛。

  • 极速申请 - 只要认证的网站通过验证,当时即可颁发证书

  • 免费和访问速度兼得

  • 对于域名所有权的验证,支持两种方式:放临时文件进行验证、查询 whois 给域名所有人发邮件验证

  • 无需注册账户

  • 关键是稳定,背后的支持的组织很强大

缺点:

  • 一次只能颁发3个月有效期的证书,到期之后需要自己再续上 (仍然是免费的),这点维护起来比较麻烦,不过我们可以使用工具自动续期。

  • 不支持通配符泛域名 (*.demo.com),所以在申请认证是时候,要把域名都 301 跳转到证书里包含的域名上,不然浏览器会弹证书错误。

流程

默认 Let's Encrypt 申请证书比较繁琐,所以我们在 windows 下使用工具 letsencrypt-win-simple 进行部署,简单方便快捷。

  1. 下载 letsencrypt-win-simple

  2. 在服务器中打开CMD,运行letsencrypt-win-simple

  3. 在CMD中根据简单的命令,输入要认证的网站域名和网站文件夹

  4. letsencrypt-win-simple 自动验证域名所有权

  5. 验证通过后即时颁发证书

  6. 部署

使用 letsencrypt-win-simple 进行自动化认证和部署

下载最新版 letsencrypt-win-simple:

本人在2016年9月15日下到的最新版是:letsencrypt-win-simple.V1.9.1.zip。

自动化认证

在服务器解压 letsencrypt-win-simple.V1.9.1 得到文件夹,打开CMD进入到该文件夹下。

第一次运行命令会连接远程服务器更新,并且会让你是否输入邮箱订阅认证信息,可以忽略,然后让做个选择(忘记什么选择了),选择Y即可,选择N则会中断。

部署单个域名

  • 输入以下命令

    letsencrypt.exe --accepttos --manualhost 你的域名 --webroot 你的网站物理路径(wwwroot路径)
  • letsencrypt-win-simple.V1.9.1 会自动生成临时文件并放到网站根目录,然后会让 Let's Encrypt 服务器会访问这个文件, 用于验证这个网站是否属于你。

  • 如果验证不通过,是因为 IIS 需要修改一些配置,具体参见下文的详细说明。

  • 验证通过后会实时颁发证书,并且 letsencrypt-win-simple.V1.9.1 会自动把证书添加到服务器中,然后直接在 IIS 中进行HTTPS部署即可。

部署多个域名

  • 输入命令 letsencrypt.exe --san

  • 输入 M ,表示此次需要认证多个域名

  • 输入网站的 host

  • 输入要认证的多个域名,用 , 号分隔,比如tasaid.com,www.tasaid.com,m.tasaid.com

  • 输入网站物理路径,比如 C:\Users\linkFly\Documents\Said\SaidTemp

  • letsencrypt-win-simple.V1.9.1 会自动生成临时文件并放到网站根目录,然后会让 Let's Encrypt 服务器会访问这个文件, 用于验证这个网站是否属于你。

  • 如果验证不通过,是因为 IIS 需要修改一些配置,具体参见下文的详细说明。

  • 验证通过后会实时颁发证书,并且会自动把证书添加到服务器中,然后直接在 IIS 中进行HTTPS部署即可。

自动化认证单个域名

解压 letsencrypt-win-simple.V1.9.1 文件夹,然后点击文件夹,按住shift,再点击右键,选择在此处打开命令窗口 (即让控制台打开后直接定位到这个文件夹下)。

使用下面的命令:

letsencrypt.exe --accepttos --manualhost 你的域名 --webroot 你的网站路径(wwwroot路径)

比如 https://tasaid.com 部署的命令是这样的:

letsencrypt.exe --accepttos --manualhost tasaid.com --webroot C:\Users\linkFly\Test

letsencrypt-win-simple 会自动生成临时文件并放到网站根目录 (详情可以参考下一章节 自动化认证多个域名 ),然后会让 Let's Encrypt 服务器会访问这个文件, 用于验证这个网站是否属于你。

如果验证通过,直接进入本文的 部署 章节即可。如果验证不通过,是因为需要修改 IIS 的一些配置,请参考下一章节 自动化认证多个域名

自动化认证多个域名

CMD 进入 letsencrypt-win-simple.V1.9.1 文件夹,运行如下命令:

letsencrypt.exe --san

然后会弹出一坨选项:

Let's Encrypt (Simple Windows ACME Client)
Renewal Period: 60
Certificate Store: WebHosting
ACME Server: https://acme-v01.api.letsencrypt.org/
Config Folder: C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simple\htpsacme-v01.api.letsencrypt.org
Certificate Folder: C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simpe\httpsacme-v01.api.letsencrypt.org
Loading Signer from C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simpe\httpsacme-v01.api.letsencrypt.org\Signer
Getting AcmeServerDirectory
Loading Registration from C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\Registration
Scanning IIS Sites
2: SAN - IIS Said (C:\Users\linkFly\Test)
3: SAN - IIS Test (C:\Users\linkFly\Demo)
W: Generate a certificate via WebDav and install it manually.
S: Generate a single San certificate for multiple sites.
F: Generate a certificate via FTP/ FTPS and install it manually.
M: Generate a certificate manually.
A: Get certificates for all hostsQ: Quit
Which host do you want to get a certificate for:

Scanning IIS Sites 列出了在 IIS 中检测到的当前已发布的网站,然后显示了一系列指令 (W, S, F, M, A),决定你想要的操作:

  • W - 生成一个证书并通过 WebDav 来进行安装

  • S - 给 IIS 当前已经发布的所有网站都部署一个证书

  • F - 生成一个证书通过FTP、FTPS安装。

  • M - 通过配置手动生成证书

  • A - 给 IIS 当前已经发布的所有网站各自部署上对应的证书

我们这次要认证手动认证多个域名,输入命令:

M

接着出现让你输入host( Enter a host name )。比如 http://tasaid.com 输入的是tasaid.com。

然后会让你输入要认证的多个域名 (注意这些域名要可以访问的,因为一会儿会轮流访问这些域名进行验证),用,号分隔 (Enter all Alternative Names seperated by a comma:),然后我们输入需要验证的域名即可:

tasaid.com,www.tasaid.com,m.tasaid.com,wap.tasaid.com

接着输入站点部署的位置 (Enter a site path ),输入你的网站部署的位置即可:

C:\Users\linkFly\Documents\Said\SaidTemp

然后输入是否要指定使用者 (用户),输入 N。( 一旦选择了Y,会让你输入用户名和密码,证书会进行用户认证 )。

接着会在你此次认证的项目根目录下 (wwwroot) ,根据你刚才输入的域名列表,生成对应的临时认证文件, Let's Encrypt 服务器会访问这个文件,结构大概如下:

---- wwwroot(认证的网站根目录)| -- .well-known
| -- acme-challenge
| -- DGz4z_A_VsgO3dilCAB8bkgurpPt-EFpLygmua3L6x8 (一个临时文件,多个域名会有多个临时文件)

然后 Let's Encrypt 服务器会根据刚才输入的域名列表,用 HTTP 轮流访问这些文件,注意这时候可能存在这个报错:

******************************************************************************The ACME server was probably unable to reach http://linkflys.com/.well-known/acme-challenge/DGz4z_A_VsgO3dilCAB8bkgurpPt
Check in a browser to see if the answer file is being served correctly.*****************************************************************************

出现这个错误表示生成的这个临时文件访问不到,验证不通过。

原因是因为 .well-know 这个文件夹带了前缀.,IIS会认为是不可识别的 MIMEType ,只需要在网站根目录下临时加上 mimeMap 配置即可:

<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="text/plain" />
</staticContent>
</system.webServer></configuration>

记得验证通过后,如果你的网站不需要这个 mimeMap 配置,要记得删除。

如果验证通过,会显示下图,这时候恭喜你验证通过。

部署

打开 IIS,选择对应的网站,右键 编辑绑定,点击 新增, 类型 选择https,则会弹出如下界面:

输入要绑定的域名,然后选择颁发的证书即可。域名 日期 上午/下午这种格式就是 Let's Encrypt 此次颁发的证书。

这个时候,使用 https 协议访问你的域名就可以啦,比如:https://tasaid.com。

查看证书

在服务器中查看证书

在服务器中,Win + R 打开运行,输入 MMC,打开 控制台 界面。

点击顶部菜单栏 文件,然后点击 添加/删除管理单元

弹出的窗口中,在左侧的 可用的管理单元 中点击 证书,然后点中间的 添加,会弹出如下界面:

选择 计算机账户,然后默认下一步完成,点击 确定,即可看到证书列表。

展开 证书,再展开 中间证书颁发机构,选择 证书,即可看到 Let's Encrypt 颁发的证书:

在chrome中查看证书

使用 HTTPS 访问网址,点击地址栏的小 绿锁,然后点击 详细信息,这时候会弹出 chrome 调试工具,点击 View certificate:

就会看到证书的详细信息:

其他

IIS 配置 web.config 实现自动 HTTPS 跳转

为了保证域名统一,将访问 http://www.tasaid.com、http://tasaid.com、https://www.tasaid.com 的域名都跳转到 https://tasaid.com,IIS 可以进行如下配置 (需要安装 IIS UrlRewrite 模块,代码注释是为了方便理解,部署到线上请删除中文注释):

<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HostNameRule1">
<match url="(.*)" />
<!--匹配所有条件-->
<conditions logicalGrouping="MatchAny">
<!--当不是使用https协议访问的时候-->
<add input="{HTTPS}" pattern="^OFF$" />
<!--并且访问的host不是tasaid.com这种,例如www.tasaid.com-->
<add input="{HTTP_HOST}" pattern="^tasaid\.com$" negate="true" />
</conditions>
<!--跳转到https-->
<action type="Redirect" url="https://tasaid.com/{R:1}" />
</rule>
<rule name="HTTPS redirect">
<match url="(.*)" />
<conditions>
<!--当使用HTTPS协议访问-->
<add input="{HTTPS}" pattern="^ON$" />
<!--当访问 https://www.tasaid.com的时候 -->
<add input="{HTTP_HOST}" pattern="^tasaid\.com$" negate="true" />
</conditions>
<!--跳转到HTTPS-->
<action type="Redirect" url="https://tasaid.com/{R:1}" redirectType="SeeOther" />
</rule>
</rules>
</rewrite>
</system.webServer></configuration>

这里需要注意,想让 https://www.tasaid.com 也可以跳转到 https://tasaid.com,在申请 HTTPS 证书的时候,要把 www.tasaid.com 这种域名也给申请上,否则浏览器会解析不出 https://www.tasaid.com,因为在进行 HTTPS 加密握手的时候就会认证失败。

chrome 调试中发现 HTTPS 改动不生效

HTTPS 第一次连接域名的时候会和证书颁发机构进行 HTTPS 证书认证,后续的连接会缓存起来,清缓存就好了

注:本文转自tasaid.com,站长之家已获授权,如需转载,请联系原作者。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:做个赚钱的斜杠青年,真的不难!(第一弹)

下一篇:2016自媒体盈利赚钱的十种有效方法