想要启用 https 连接首先需要证书. 我们可以使用最近比较流行的 Let’s Encrypt 提供的免费证书. 但是我使用 Let's Encrypt 官方提供的申请脚本申请的时候, 总是不能成功. 于是使用了 v2ex 上有人推荐的大神制作的 acme.sh 脚本.

虽然 acme.sh 有官方使用说明, 但是我还是想把我的成功过程记录下来.

这次我想申请证书的域名分别是: zhanglintc.co, www.zhanglintc.co, mmrz.zhanglintc.co. 这里要注意, 要支持几个域名就要完整的写几个, 仅申请zhanglintc.co的话并不能替代www.zhanglintc.commrz.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.cerzhanglintc.co.key. 一会儿将在 Nginx 的配置文件中使用.

根据 acme.sh 的说明, 它并不建议使用直接使用该路径下的证书, 所以我将这些证书转移到了 ~/ssl 下.

此时打开 Nginx 的配置文件:

sudo vim /etc/nginx/sites-available/default 

以 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:R    SA+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 吧.

2017-03-14 13:2711