为网站配置免费的SSL证书
前言
SSL证书(Secure Socket Layer)用来提供对用户和服务器的认证,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,为网站配置SSL证书后,就可以以https方式访问网站了。
在很多云厂商处申请SSL证书是收费的。为了省钱,我们可以申请一个免费的SSL证书。例如从Let’s Encrypt这里,就能申请到免费的SSL证书。Let’s Encrypt是一个提供SSL/TLS证书的非营利证书颁发机构,只需简单几步便可完成SSL证书的申请。
申请证书
为了省事,我直接用自己的云服务器厂商代申请的方式搞了个SSL证书。过程很简单,到后台DNS解析页面添加一条TXT
类型的记录即可,主机名和记录值和他提供的一致就行。等解析生效后再验证就能获得证书了。也可以根据官网文档进行申请,这里不再赘述。
在获得证书后,我们需要下载给出的私钥文件(.key)和证书文件(.pem),并上传到服务器上。
配置证书
假设你已经将私钥文件和证书文件下载到了本地,可以使用scp
上传这两个文件:
1 | scp yoursite.key yoursite.pem user@xxx.xxx.xx.xxx:/home/card |
我的网站是Nginx驱动的,对于Nginx,我们需要修改如下配置文件:
1 | /etc/nginx/nginx.conf |
不同情况下配置文件的路径可能也不一样,可以自行查找一下Nginx的配置文件在哪。
在Nginx配置中添加如下修改:
1 | http { |
记得务必把server_tokens
设置为off
,提升你服务器的安全性(报错不提示Nginx版本号)。
其它设置如Logging Settings
等可以自行调整一下,现在应该已经成功配置了你的SSL证书了。
使用systemctl
重启Nginx服务:
1 | systemctl restart nginx | systemctl status nginx.service |
输出没有报错和警告,再次访问你的网站看看:
现在就可以以https方式访问你的网站了。不过证书一般有效期只有90天,过期需要续签
如果不想手动续签,也可以使用acme.sh
等方案来实现自动续签。
错误处理
如果你是按照上述方式配置Nginx的,理论上不会出现什么问题。坑已经踩好了。
我在配置过程中一共遇到了两个问题,都是自己脑抽了:
- 配置完成后访问网站出现400报错
服务器提示400 Bad Request
,The plain HTTP request was sent to HTTPS port
查看配置文件,
1 | listen 443; |
应改为
1 | listem 443 ssl; |
这是因为高版本的Nginx修改了配置语法,修改后用#注释掉ssl on;
即可
- 配置完成后访问网站出现504报错
服务器提示504 Gateway Timeout
查看配置文件,发现是location
里的proxy_pass
配置的端口号错了(应该是80,我不知道为什么写的是8080)