今天,通过无数次折腾,向往已久的域名备案终于下来了。因而火烧眉毛地将我的博客网站进行 HTTPS 部署迁移,中间遇到一些坑,在此作个记录。css
之因此要将网站从 http 迁移到 https,缘由有:前端
- 安装证书
- nginx 反向代理
- 更改前端链接方式
为何须要证书?这和 HTTPS 协议的设计有关。 HTTPS,指的是 Hypertext Transfer Protocol Secure,另外也也能够称为 HTTP over SSL 或者 HTTP over TLS。通俗一点,HTTPS 经过 Http 协议传输数据,SSL/TLS 加密数据。vue
它是如何实现加密的呢?node
首先,浏览器厂商预先安装了各个 证书颁发机构
的证书,用于对访问网站进行安全验证 而后,我的向 证书颁发机构
申请我的证书,并将证书应用于服务器配置中。 以后浏览器访问服务器,获取公钥,将其与已有的证书列表匹配,决定是否继续。 若是经过,浏览器经过公钥与服务器通讯,协商两个非对称私钥,用于各自的数据传输加密,从而创建的加密通道,防止中间人窃听。python
如何安装证书? 向证书颁发机构申请证书便可。目前的机构有Symantec、Comodo、GoDaddy 以及 Let's Certbot。这里咱们选择免费的 Let's Certbot。ios
在官网上有详细的说明。个人环境是 Linux 16.04 Nginx
,其余的环境能够参照官网说明:nginx
#####安装:git
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx
复制代码
$ sudo certbot --nginx certonly
复制代码
能够参考 这里github
根据提示,顺利安装完毕。这里有个前提,就是服务器要有域名,而国内的域名都须要按照工信部要求备案,这也是为何我须要等待大半个月的缘由。axios
证书安装完毕,若是部署在 nginx 中的是静态页面,那么此刻已经顺利部署了 HTTPS 服务。可是更多的应用场景中,咱们一方面提供静态服务,如 img、js、css 等等,另外一方面咱们也须要 REST 服务。 可是此刻,当咱们经过 axios 或者 vue-resource 这样的 HTTP client 库来访问 Node.js 服务 API 来获取数据,发现浏览器禁止了该链接。缘由是在部署 HTTPS 服务后,整站都要使用 https 来进行数据传递,包括资源的获取,GET/POST
请求等等。
如何解决?我在这走了一些弯路。当时想,由于是访问 Node.js 服务器的 API,我知道 Node.js 是支持 HTTPS 服务的,因此想固然在 Node 中使用 Openssl
来进行自认证。网上有不少相似的教程,可是在浏览器中,对于自认证的证书并不承认。因此这种方法可行但不适用于其余用户访问,更不能应用于生产环境。这里推荐几个工具:
第一个是能够发送模拟浏览器发送各类请求,对于测试 API 来讲十分方便 第二个之因此在这里推荐是由于我一开始使用 Chrome,但给出的错误提示很模糊,而 Firefox 在 Network 中对于 Request/Response 错误信息会更直白,在这个问题上帮了我不少忙。
正是 Firefox 给出的提示:xxxx 提供了不支持的自签名证书..
,我知道自签名走不通,因而往 Nginx 上考虑了一下,想到 nginx 有反向代理功能,若是说,作一个 api 的反向代理,导航到 node 服务端口,会不会有用呢?因而在网上查找了 Nginx 反向代理的教程,操做以下:
在 /ete/nginx/site-available/default
中:
location /api {
proxy_pass http://localhost:8089;
proxy_buffering on;
}
复制代码
重启 nginx,重启 node 服务。
success!
这样,咱们经过反向代理让 REST 服务无需担忧证书问题,由于 Nginx 已经作了这一部分工做。
这一部分可选,由于我以前使用的是 vue-resource
,链接使用 this.$http
因此没法对 HTTPS 进行链接,解决该问题,能够:
整个过程写的比较乱,缘由仍是本身对 SSL/TLS 的底层协议不熟悉,并且 Nginx 也是新学,反向代理以前只有所耳闻,并无实际操做过。但不得的说,Nginx 的配置方式比较友好,一看就明白它是什么意思。因此配置起来也不复杂。
接下去会把这部分在深刻一点,写一个系列吧。