Let’s Encrypt certbot部署

Let’s Encrypt 项目发布了一个官方的客户端 Certbot ,利用它可以完全自动化的获取、部署和更新安全证书。

环境

  • CentOS
  • Nginx

部署

  • 获取 Certbot 客户端

    1
    2
    3
    cd /usr && mkdir certbot && cd certbot
    wget https://dl.eff.org/certbot-auto
    chmod a+x ./certbot-auto

    网上也有用certbot部署的,certbot-auto 和 certbot 本质上是完全一样的;不同之处在于运行 certbot-auto 会自动安装它自己所需要的一些依赖,并且自动更新客户端工具。因此在你使用 certbot-auto 情况下,只需运行在当前目录执行即可

  • 配置 nginx

    1
    2
    3
    4
    5
    6
    7
    location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /usr/local/nginx/html;#这个建议就放在nginx的静态目录里
    }
    location = /.well-known/acme-challenge/ {
    return 404;
    }

以webroot方式手动验证,会在/usr/local/nginx/html 生成隐藏目录用于验证

  • 重启 nginx

    1
    service nginx reload
  • 生成证书

    1
    2
    3
    ./certbot-auto certonly --email admin@163.com --agree-tos --webroot
    -w /usr/local/nginx/html/ -d your.domain.com -d xxx.domain.com
    -w /usr/local/nginx/html2/ -d your2.domain.com -d xxx2.domain.com

    –email邮箱地址是用来收通知,–agree-tos屏蔽窗口,因为这个过程会有窗口出现需要输入邮箱;

    certbot的两种工作方式

    • standalone 方式: certbot 会自己运行一个 web server 来进行验证。如果我们自己的服务器上已经有 web server 正在运行 (比如 Nginx 或 Apache ),用 standalone 方式的话需要先关掉它,以免冲突。

    • webroot 方式: certbot 会利用既有的 web server,在其 web root目录下创建隐藏文件, Let’s Encrypt 服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权

    成功提示如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/your.domain.com/fullchain.pem. Your cert
    will expire on 20XX-09-23. To obtain a new or tweaked version of
    this certificate in the future, simply run certbot again. To
    non-interactively renew *all* of your certificates, run "certbot
    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/your.domain.com/ 生成4个证书

文件名 文件名
cert.pem 服务端证书
chain.pem 浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书
fullchain.pem 包括了cert.pem和chain.pem的内容
privkey.pem 证书的私钥
  • 再次配置 nginx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    server {
    listen 443 ssl;
    #listen [::]:443 ssl ipv6only=on;
    ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem;
    #ssl_trusted_certificate /etc/letsencrypt/live/your.domain.com/chain.pem;
    ... other config
    }
    1
    service nginx reload
  • http 跳转

    1
    2
    3
    4
    5
    server {
    listen 80;
    server_name xxx.com;
    rewrite ^(.*)$ https://$host$1 permanent;
    }

    现在通过浏览器访问你的网站:https://your.domain.com 试试,如果看到浏览器的绿色标志,恭喜你设置成功!

    不过由于这个证书的时效只有90天,我们需要设置自动更新的功能,帮我们自动更新证书的时效。

自动更新证书

  • 模拟
1
./certbot-auto renew --dry-run
1
2
3
4
5
6
7
8
9
10
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/your.domain.com.conf
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/your.domain.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)

如上信息就表示成功

  • 添加自动任务

    1
    sudo crontab -e
    1
    * */12 * * * /usr/certbot/certbot-auto renew >> /usr/certbot/log/renew.log

    Let’s Encrypt的推荐每12小时更新一次。更新操作并不一定会真的更新证书,只有在快到期的时候才会更新。注意log目录要有写权限

参考

https://segmentfault.com/a/1190000005797776

http://www.tuicool.com/articles/26ba2eV