在nginx上开启使用https

这两天在自己的博客上启用了全站https,把过程在这里分享一下。

什么是https

维基百科上是这样定义的;

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。

由于我们网络状况复杂,https有一个很重要的作用是防止运营商和路由器的拦截😓。

站点开启https后,浏览器访问时会有标记,chrome上是一把绿色的锁:

浏览器展现

嗯,安全!

申请证书

CA机构颁发的证书有3种类型,信用登机从低到高分别为域名型SSL证书(DV SSL),企业型SSL证书(OV SSL),增强型SSL证书(EV SSL)。

企业型SSL证书(OV SSL),增强型SSL证书(EV SSL)还是比较贵的,个人博客站用域名型SSL证书就可以了。

我的服务器放在腾讯云,腾讯云可以申请免费的DV SSL证书:

免费DV SSL证书

证书申请只需要填写域名及邮箱,再验证一下域名的归属就可以了。官网上写的审核需要1个工作日。但是我等了不到半个小时就通过了。

免费DV SSL证书

通过之后可以下载到本地,有两个文件。分别是.crt结尾的证书文件和.key结尾的私钥文件。

证书安装

之前博客是用node做的静态服务,一直想学nginx,这次正好一起换了。nginx上配置https非常简单,编辑nginx.conf文件(如果不知道在哪里可以运行一下nginx -t):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 443;
ssl on;
ssl_certificate /path/to/1_www.domain.com_bundle.crt;
ssl_certificate_key /path/to/2_www.domain.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录
index index.html index.htm;
}
}

配置完成后,先用bin/nginx –t来测试下配置是否有误,正确无误的话,重启nginx。就可以使 https://www.domain.com 来访问了。

全站https

全站https其实就是在用户访问http站点时跳转到https,这个也可以设置nginx的转发来完成。

腾讯云上写的是使用rewrite:rewrite ^(.*) https://$host$1 permanent;,由于需要匹配正则对性能有影响,因此不是最好的方法。

更推荐的做法是直接使用301永久转移:

1
2
3
4
server {
listen 80;
return 301 https://$host$request_uri;
}