Fork me on GitHub

超详细Nginx服务器配置SSL证书,全站开启HTTPS教程

四月的时候就想做全站HTTPS,那个时候因为阿里云主机的原因、WORLDPRESS的原因没弄成功。后来一怒之下换了博客程序,买了一个腾讯云服务器,然后又因为网站备案的原因,工作的原因一直耽误,昨天临时起意写篇博客,就想起了一直都没做的HTTPS,在之前公司的基友的帮忙下,花了两个多小时基本弄好了HTTPS,但这中间遇到了非常多的坑。

在开始配置之前,我按照官方的教程开始了操作,如下:

1. 获取证书

Nginx文件夹内获得SSL证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key,
1_www.domain.com_bundle.crt 文件包括两段证书代码 “—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”,
2_www.domain.com.key 文件包括一段私钥代码“—–BEGIN RSA PRIVATE KEY—–”和“—–END RSA PRIVATE KEY—–”。

这步操作基本没问题,把属于自己的证书下载下来即可,就两个文件。

2. 证书安装

将域名 www.domain.com 的证书文件1_www.domain.com_bundle.crt 、私钥文件2_www.domain.com.key保存到同一个目录,例如/usr/local/nginx/conf目录下。
更新Nginx根目录下 conf/nginx.conf 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443;
server_name www.domain.com; #填写绑定证书的域名
ssl on;
ssl_certificate 1_www.domain.com_bundle.crt;
ssl_certificate_key 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 来访问了。

这步是非常的坑爹,因为服务器系统版本的不同会导致存在多个配置文件,就拿我的服务器(Ubuntu16.04)来说,我的网站配置跟nginx配置是两个不同的文件,之前就因为这个问题导致我的配置失效,而且有的nginx服务器目录下没有conf这个文件夹,直接就是nginx.conf这个文件。之前我把这个配置文档写到了另外一个default文件,结果发现不行,这里一定要写在nginx服务器下的配置里。

写好之后的bin/nginx –t测试我没做成功,输入了什么反应也没有,重启nginx之后访问:https://www.liuyude.com;发现证书已经加载出来了,但是浏览器仍然提示我不安全,原因很简单,无非是网站还存在HTTP请求,没有全站HTTPS,或者是80端口的HTTP访问仍然正常,没有做301重定向;接下来我们就要做全站HTTPS了。

注:

配置文件参数 说明
listen 443 SSL访问端口号为443
ssl on 启用SSL功能
ssl_certificate 证书文件
ssl_certificate_key 私钥文件
ssl_protocols 使用的协议
ssl_ciphers 配置加密套件,写法遵循openssl标准

3. 使用全站加密,http自动跳转https(可选)

对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。
在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。Nginx是支持rewrite的(只要在编译的时候没有去掉pcre)
在http的server里增加rewrite ^(.*) https://$host$1 permanent;
这样就可以实现80进来的请求,重定向为https了。

跳转这个地方遇到了一个特别大的坑,就是把重定向写到了第2步的server里面,然后会报一个“重定向次数过多”的错,然后无法打开网页,后来查了资料发现是重定向规则不能写到443端口下面,因为443已经是HTTPS访问了,解决办法是把重定向写到80端口下,只是把80端口的请求转发成HTTPS请求。

4. 一些其它的坑

4.1 图片外链

因为网站要做全站HTTPS,所以当某一个页面存在站内的HTTP请求时,就会提示网页不安全。解决办法是换一个支持HTTPS的图床,然后把图片链接全部替换为HTTPS的。

4.2 404页面跳转

之前不支持HTTPS的时候,在80端口我定义了404页面,然后现在统一将80端口的请求转发到了443端口,因为在443端口没定义404页面,导致会出现服务器禁止的错误页面。解决办法就是把80端口的404配置复制一份到443端口,然后问题解决。

4.3 腾讯公益404页面

因为之前用的腾讯公益404页面中有一个js文件的请求是HTTP的,导致404页面样式出错,后来知乎找到了最新版的腾讯公益404代码,不过这个问题也没有完全修复,现在查看我404页面请求的时候还是发现其中几条腾讯的请求是HTTP的,依然会提示页面不安全。

4.4 评论工具

现在用的评论工具是来必力,感觉有点坑,每次来必力加载出来之后都会莫名其妙的带有HTTP请求,考虑将来必力更换掉。

以上就是本次操作的总体流程,记录下来以便于下次出现问题时候能够经验复用,心心念的小绿锁终于实现了,美滋滋!