在上一篇文章《群晖 Docker 搭建自有 Leanote 服务》中,介绍了如何在群晖 Docker 中部署 Leanote 服务,最终做到了在浏览器中通过 HTTP 协议访问服务。
但是 HTTP 并不安全,对于我们博客站点,比较蛋疼的缺陷就是运营商会在页面注入广告,这不能忍。
那么切换到 HTTPS 就很有必要了。
准备证书
群晖 DSM 系统很贴心,已经为我们提供了默认证书,同时也可以用图形化界面的方式生成证书。
进入“控制面板->安全性->证书”,即可看到有哪些信息:
这块的基本配置过程比较简单,此处不赘述。
反向代理服务器
实际上,配置成功之后,我们期望用户的请求处理流程是这样的:
- HTTPS 请求进入反向代理服务;
- 反向代理服务通过配置得到该请求的目标服务器(Docker 容器)信息,然后用 HTTP 方式向目标服务器发起请求;
- 目标服务器响应反向代理服务的请求,发送 HTTP 响应报文;
- 反向代理服务器拿到 HTTP 响应报文后,将其转换为 HTTPS 响应报文,发送给用户。
调整 Docker 容器及 Leanote 配置
由于配置成功后,我们还想使用之前的 9000 端口来访问服务,因此不能直接在 Docker 处做端口映射,停掉 Docker 服务,然后删掉之前配置的 9000 端口映射即可。
另外,/data/leanote/conf/app.conf
中 site.url
也要改成 https
形式。
调整完之后,启动容器。
配置反向代理规则
进入“控制面板->Synology 应用程序门户->反向代理服务器”,可以在这里管理反向代理规则。
点击“新增”按钮,填上如下配置:
由于 HTTP2 有多路复用优化,所以此处启用了 HTTP2。
HSTS 主要是让 HTTPS 更加安全。因为现在处于 HTTP -> HTTP2
的过度时期,很多时候访问服务器的不会一上来就声明采用 HTTPS 方式。比如用户在地址栏里面输入:www.baidu.com
,实际上浏览器会首先将这个地址补全为 http://www.baidu.com
,然后执行后续流程,但是 www.baidu.com
这边又只提供了 HTTPS 服务,这个时候就需要将 HTTP 转换成 HTTPS。
问题是,在这个过程中,浏览器怎么知道应该转换呢?在之前,有一种方案:
- 浏览器将
http://www.baidu.com
请求发给服务器; - 服务器收到请求之后,返回一个重定向响应(3xx),让浏览器重新发起一个 HTTPS 请求。
很明显,这个过程会存在中间人攻击风险(SSL 剥离攻击)。于是有人提出了另一种方案:
- 浏览器将
http://www.baidu.com
请求发送给服务器,服务器直接返回错误页面; - 用户通过某种途径(可能手动地址栏输入,可能点击了某个其他站点的链接),发送
https://www.baidu.com
到服务器,服务器在响应头中包含Strict-Transport-Security
字段,告诉浏览器,在之后多长时间内,浏览器将相关域名的 HTTP 请求,全部转换成 HTTPS,而不是直接向服务器发送 HTTP 请求。
这样一来,就有效规避了 SSL 剥离攻击。
Enjoy yourself
配置完毕,在浏览器地址栏中输入:https://test.synology.me:9000
,尽情享用吧!
别忘了调整客户端
由于之前配置客户端的时候,写的“自建服务地址”是使用 HTTP 协议的,改成 HTTPS 后,这些客户端也要做相应的调整。