从 HTTP 到 HTTPS - IIS 部署免费 HTTPS

这篇文章主要讲述 IIS 8 部署免费 HTTPS 。 HTTPS 是互联网 web 大势所趋。TaSaid 最近把机房从香港迁移到青岛,趁着这次机会,观望并折腾了几天,在迁移中顺便完成了 HTTPS 的部署。

这篇文章收录在《Said - 从 HTTP 到 HTTPS 》系列:

有哪些免费证书

这里只介绍在 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 进行部署,简单方便快捷。

2016-12-30 补充,如果你觉得这样还很麻烦的,请直接到本文的 自动续订 章节,介绍了 certify 这个软件,可以帮助你自动申请、验证并且续订证书。

  1. 下载 letsencrypt-win-simple
  2. 在服务器中打开CMD,运行letsencrypt-win-simple
  3. 在CMD中根据简单的命令,输入要认证的网站域名和网站文件夹
  4. letsencrypt-win-simple 自动验证域名所有权
  5. 验证通过后即时颁发证书
  6. 部署

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

下载最新版 letsencrypt-win-simple

github - letsencrypt-win-simple

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

自动化认证

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

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

部署单个域名

  • 输入以下命令

    1
    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,再点击右键,选择在此处打开命令窗口 (即让控制台打开后直接定位到这个文件夹下)。

使用下面的命令:

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

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

1
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 文件夹,运行如下命令:

1
letsencrypt.exe --san

然后会弹出一坨选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 hosts
Q: 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 当前已经发布的所有网站各自部署上对应的证书

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

1
M

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

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

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

hostname

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

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

hosts

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

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

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

files

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

1
2
3
4
5
6
******************************************************************************
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 配置即可:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="text/plain" />
</staticContent>
</system.webServer>
</configuration>

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

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

success

部署

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

iis

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

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

自动续订

2016-12-29 更新, 距我首次为 IIS 部署到近日,刚好满了 90 天,今天发现自己的证书已经过期,并且没有自动续订,于是又小小了折腾了一下。

按照 letsencrypt-win-simple 项目中介绍的用法和查阅的一些资料, 使用:letsencrypt --renew 命令即可以自动设立定时任务并自动更新,详情请参考这里这里

我执行了这条命令,然而现在并没有什么卵用,也没有自动续订证书,查了半天也没有查到原因,于是特意来分享另外一种方案。

在网上找到了一个自动续订的 GUI 软件,叫做 certify,按照原作者的说法是可以自动配置、创建和自动续订证书,并且到快要续订的时候会自动发邮件给你。当然,这里我也只能等三个月之后才能确认是否如此。

首先先去 官网下载 certify ,然后在服务器上安装。注意,certify 要求以管理员权限运行,并且要求服务器安装了 PowerShell 4.0PowerShell 4.0 默认集成在 Windows Management Framework 4.0 中,而 Windows Management Framework 4.0 又依赖 Microsoft .NET Framework 4.5 (坑爹啊)。

可以查看下自己的服务器是否具备这些环境,然后按需更新即可。更新之后安装 certify 运行。

点击 New Contact 按钮,创建一个联系人,这个联系人会在证书快要过期的时候收到续订证书的提醒邮件,输入自己常用的 email 即可。

certify

然后点击 New Certificatecertify 会自动扫描 IIS 中的站点,然后选择你要申请证书的域名。

certify

点击 Request Certificate 获取证书,certify 会在网站根目录下生成 .well-known 文件夹,并且会自动配置 web.config,自动验证证书。

验证完成后会弹窗显示证书已安装。然后你就可以看到自己已经申请的证书详细信息了,并且 IIS 中也已经自动给你配置好了证书。

certify

吐个槽,感觉这篇文章介绍的所有的东西,都被 certify 给搞定了…

certify 官网上作者说这个软件还出于 beta/alpha 阶段,所以某些地方可能会出问题,如果发现证书没有续订或者没有生效,点击一下 Auto Apply 就可以了。

最后记得把网站根目录下的 .well-known 目录给删掉,保持网站目录清洁。

查看证书

在服务器中查看证书

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

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

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

certificate

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

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

certificate

在chrome中查看证书

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

chrome certificate

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

chrome certificate

其他

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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 证书认证,后续的连接会缓存起来,清缓存就好了

参考和引用


从 HTTP 到 HTTPS - IIS 部署免费 HTTPS
https://tasaid.com/posts/c316d121/
作者
linkfly
发布于
2016年10月5日
更新于
2018年3月8日
许可协议