使用 HTTPS 访问 Leanote 站点

原文地址

在上一篇文章《群晖 Docker 搭建自有 Leanote 服务》中,介绍了如何在群晖 Docker 中部署 Leanote 服务,最终做到了在浏览器中通过 HTTP 协议访问服务。

但是 HTTP 并不安全,对于我们博客站点,比较蛋疼的缺陷就是运营商会在页面注入广告,这不能忍。

那么切换到 HTTPS 就很有必要了。

准备证书

群晖 DSM 系统很贴心,已经为我们提供了默认证书,同时也可以用图形化界面的方式生成证书。

进入“控制面板->安全性->证书”,即可看到有哪些信息:

image

这块的基本配置过程比较简单,此处不赘述。

反向代理服务器

实际上,配置成功之后,我们期望用户的请求处理流程是这样的:

  • HTTPS 请求进入反向代理服务;
  • 反向代理服务通过配置得到该请求的目标服务器(Docker 容器)信息,然后用 HTTP 方式向目标服务器发起请求;
  • 目标服务器响应反向代理服务的请求,发送 HTTP 响应报文;
  • 反向代理服务器拿到 HTTP 响应报文后,将其转换为 HTTPS 响应报文,发送给用户。

调整 Docker 容器及 Leanote 配置

由于配置成功后,我们还想使用之前的 9000 端口来访问服务,因此不能直接在 Docker 处做端口映射,停掉 Docker 服务,然后删掉之前配置的 9000 端口映射即可。

另外,/data/leanote/conf/app.confsite.url 也要改成 https 形式。

调整完之后,启动容器。

配置反向代理规则

进入“控制面板->Synology 应用程序门户->反向代理服务器”,可以在这里管理反向代理规则。

点击“新增”按钮,填上如下配置:

image

由于 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 后,这些客户端也要做相应的调整。

推荐阅读更多精彩内容