想要启用 https 连接首先需要证书. 我们可以使用最近比较流行的 Let’s Encrypt 提供的免费证书. 但是我使用 Let's Encrypt 官方提供的申请脚本申请的时候, 总是不能成功. 于是使用了 v2ex 上有人推荐的大神制作的 acme.sh 脚本.
虽然 acme.sh 有官方使用说明, 但是我还是想把我的成功过程记录下来.
这次我想申请证书的域名分别是: zhanglintc.co
, www.zhanglintc.co
, mmrz.zhanglintc.co
. 这里要注意, 要支持几个域名就要完整的写几个, 仅申请zhanglintc.co
的话并不能替代www.zhanglintc.co
和mmrz.zhanglintc.co
.
1. 下载脚本
根据官方说明, 先下载 acme.sh:
curl https://get.acme.sh | sh
2. 申请证书
官方文档上有很多方法, 我选择了 dns 验证的方法.
同样这里要写全所有的域名:
acme.sh --issue -d zhanglintc.co -d www.zhanglintc.co -d mmrz.zhanglintc.co --dns
完成这一步以后, 脚本会自动生成一些 TXT 记录, 比如 _acme-challenge.www.zhanglintc.co
=> _NUBoAv8RBaeyLvGD_9BMtGNlIttBMfTxKuhJ3G6o1Q
. 这个需要手动添加到自己的域名解析服务商比如 dnspod
那里. 但是要注意 主机记录
此时无需写成 _acme-challenge.www.zhanglintc.co
, 而是只需记录 _acme-challenge.www
. 同理 _acme-challenge.mmrz.zhanglintc.co
只需记录 _acme-challenge.mmrz
.
在配置好域名解析商以后, 需要重新生成证书:
acme.sh --renew -d zhanglintc.co -d www.zhanglintc.co -d mmrz.zhanglintc.co
3. 使用证书
在完成申请后, 证书会出现在 ~/home/imlane/.acme.sh/zhanglintc.co
路径下. 其中会有好多 .cer
, .key
后缀的文件. 其实此时我很迷惑到底哪个才是需要的. 没办法只有一个个尝试, 最后发现真正有效的是 fullchain.cer
和 zhanglintc.co.key
. 一会儿将在 Nginx 的配置文件中使用.
根据 acme.sh 的说明, 它并不建议使用直接使用该路径下的证书, 所以我将这些证书转移到了 ~/ssl
下.
此时打开 Nginx 的配置文件:
sudo vim /etc/nginx/sites-available/default # Ubuntu
sudo vim /etc/nginx/nginx.conf # CentOS
以 mmrz.zhanglintc.co 为例, 配置如下:
server {
listen 80; # 监听 http 80 端口
server_name mmrz.zhanglintc.co;
return 301 https://mmrz.zhanglintc.co$request_uri; # 重定向 http 到 https
}
server {
listen 443 ssl; # 监听 https 443 端口
server_name mmrz.zhanglintc.co;
# 这些配置貌似不是最重要的
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers On;
# 使用证书, 其实我觉得最有用的就是这两行
ssl_certificate /home/lane/ssl/zhanglintc.co/fullchain.cer;
ssl_certificate_key /home/lane/ssl/zhanglintc.co/zhanglintc.co.key;
location / {
proxy_pass http://127.0.0.1:2603;
}
}
配置完成后, 需要重启 Nginx 以生效:
sudo service nginx force-reload
根据 acme.sh 的说明, 我们使用的是 service nginx force-reload
:
一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload
4. 测试效果
完成这些以后, 正常来说, 你访问你配置好的网址就已经具有小绿锁了. 而且因为配置了 80 端口到 443 端口的跳转, 所以即使忘记输入 https 也会自动跳转到 https.
例如我这次配置好的网址:
http: http://mmrz.zhanglintc.co
https: https://mmrz.zhanglintc.co
如果成功了, 就请尽情享受 https 吧.