利用 Let`s Encrypt 为你的网站加把小锁

本文最后更新于:2020年8月21日 晚上

爱丽丝和鲍勃以及伊娃哪些不得不说的事

前言

https 是以安全为目标的 http 通道,在 http 的基础上加上了 SSL 层用于数据加密。有了这个功能你和网站的联系就可以不会被外人窃听了。这么好的功能那必须得用上啊,所以就上网找了下。还行,挺简单的。

那么就开始吧。

配置的原理

原理很简单,就是利用 Certbot 提供的工具,便捷快速地取得 Let`s Encrypt 的证书。然后在你的 nginx 里添加上它给你申请下来的证书。

我的环境是 debian10,已安装 git,nginx。没有这两个的就先安装好吧。

申请证书

申请特定域名的证书

# 先从官方仓库下载好
git clone https://github.com/certbot/certbot
# 转到对应的目录
cd certbot
# 这里我为域名为 yika.cf 的子域名 q.yika.cf 申请一个证书
./letsencrypt-auto certonly -d q.yika.cf -d yika.cf

然后它会提示你下面这样的信息

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Nginx Web Server plugin (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel):        

这句话就是说让你选一个办法去让 ACME 这个签发证书的人确定你就是这个域名的持有者。
现在我们就选第二个 standalone 吧 ,输入 2
然后就会跳出一堆信息,不用管它们。如果出现下面这种字样就说明成功了

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/q.yika.cf/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/q.yika.cf/privkey.pem
   Your cert will expire on 2020-06-02. To obtain a new or tweaked
   version of this certificate in the future, simply run
   letsencrypt-auto again. To non-interactively renew *all* of your
   certificates, run "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

就像它提示的那样,取得的公钥和私钥都存放在 /etc/letsencrypt/live/q.yika.cf/ 这个目录里面。

申请域名通配符的证书

这个步骤就是调用的命令有点不同,现在是假设你在你的 /certbot 的目录下,输入以下命令

./certbot-auto certonly  -d "*.yikakia.com" --manual --preferred-challenges dns-01  --server https://acme-v02.api.letsencrypt.org/directory

输入这个命令以后会提示下面的信息

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Cert is due for renewal, auto-renewing...
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for yikakia.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

简单地说就是把这个证书和你的机器绑定,你有固定的公网 IP 的话同意就是了。输入 y 然后回车。
然后会显示下面这样的字样

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge. 你的域名 with the following value:

fAap48jPpKKyS8ntHv9lIoAhGleXpdifuZdz0hhUcCS # 这是一串用于验证所有者的字符。为了隐私和安全我就随便乱打一串相同长度的表示吧

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...

这里就是让你在 DNS 界面新加一个 TXT 记录,域名是_acme-challenge. 你的域名,记录值为那一串字符。
下面我用 CloudFlare 的 DNS 界面做演示。

添加验证.png

这样写好了之后,等一两分钟,然后回到客户端敲回车确定要验证你是这个网址的所有者。

之后就会显示下面这样的字样。


Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/yikakia.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/yikakia.com/privkey.pem
   Your cert will expire on 2020-09-02. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

现在你的网站的域名通配符的证书就搞到手啦,以后不管是什么前缀的网址都可以用这同一个证书,非常方便。

添加监听以及开启强制 https

配置 nginx

# 输入下面的语句配置你的博客
nano /etc/nginx/conf.d/hexo.conf

这里的配置就按你自己的配置地方配吧。
打开以后,这么写配置

server {
    # 这个配置是监听 80 端口来的 q.yika.cf 的请求
    # 我们收到了后就把它转发到对应的 https 的链接上起到强制 https 访问的作用
    listen 80;
    server_name q.yika.cf;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443  ssl;
    root /var/www/hexo;
    server_name q.yika.cf;
    # 下面这两行就是写你的公钥和私钥的存放地址
    #fullchain.pem 是公钥,privkey.pem 是私钥,不要搞混了
    ssl_certificate /etc/letsencrypt/live/www.yika.cf/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.yika.cf/privkey.pem;
    access_log  /var/log/nginx/hexo_access.log;
    error_log   /var/log/nginx/hexo_error.log;
    location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
            root /var/www/hexo;
            access_log   off;
            expires      1d;
    }
    location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
        root /var/www/hexo;
        access_log   off;
        expires      10m;
    }
    location / {
        root /var/www/hexo;
        if (-f $request_filename) {
            rewrite ^/(.*)$  /$1 break;
        }
    }
}

好了现在 Ctrl+x 保存它吧。然后输入

service nginx restart

来重启 nginx 的服务。
这时候你再去看看你的博客,网址的左边是不是加了把小锁?
现在进行访问的时候我们都是强制走你的 https 协议了,不会被有心人劫持掉链接。挺好的不是么?

配置自动续期

输入

crontab -e
# 选择用你熟悉的编辑器编辑
# 然后在后面添加
0 3 1 * * /root/certbot/certbot-auto renew --renew-hook "sudo nginx -s reload"
# 现在保存了就可以了

这样你就可以高枕无忧了,自动化程序可以帮你搞定自动续期的问题。

这是让你的机器每个月 1 号的凌晨 3 点自动更新所有的证书。

尾巴

什么时候写下 HTTPS 和 RSA 的算法,来总结一下吧。爱丽丝和鲍勃以及伊娃的爱恨情仇~

参考文章

为你的 Blog 快速开启 https 支持
Hexo 启用 https 加密连接
Certbot 自动化生成 https 证书
certbot-auto 申请 https 证书,自动续期