为网站配置免费的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)