Let's Encrypt CA 项目简介

  • EFF全称Electronic Frontier Foundation,是一个国际知名的民权组织,旨在维护互联网上的公民自由、提供法律援助、监督执法机构,总部设在美国。2015年,Mozilla、思科、Akamai、IdenTrust、EFF和密歇根大学研究人员一起发布 Let's Encrypt CA 项目,计划为网站提供免费SSL证书,加速将Web从HTTP过渡到HTTPS。
  • 部署HTTPS的最大障碍是HTTPS所需证书的复杂性、官僚主义和费用,Let’s Encrypt项目的目标是解决这些问题,将证书安装的时间减少到20到30秒。Let’s Encrypt CA将由非赢利组织Internet Security Research Group (ISRG)运营。
  • Let’s Encrypt CA 本身也是一个CA机构,所有通过该项目申请的证书将由名为「Let’s Encrypt CA」的CA机构颁发。
  • Certbot 是EFF发布的Let's Encrypt CA的官方客户端,可以利用它可以完全自动化的获取、部署和更新安全证书。

Certbot 客户端相关配置

配置文件存放在 /etc/letsencrypt,包含

  • archive: 存放所有域名的证书、秘钥,可以有很多版本
  • live: 存放当前使用的证书、秘钥,链接到archive对应的文件
  • renewal: 存放证书更新的规则,包括archive_dir指定live目录链接的archive目录地址以及当前版本的cert、privkey、chain、fullchain的文件位置(都是指向archive的链接)

install & 设置环境 python3环境

$ git clone https://github.com/certbot/certbot
$ mv certbot /opt/certbot
$ cd /opt/certbot

配置python3环境:(可选)默认是Python2

$ ./tools/venv3.sh      
$ source venv3/bin/activate

生成证书

standalone模式:需要占用80和443端口

$ service nginx stop
$ ./certbot-auto certonly --debug --standalone --email haohu.th@gmail.com -d huhao.ai -d www.huhao.ai 
$ openssl dhparam -out dhparams.pem 2048
$ sudo mv dhparams.pem /etc/nginx

nginx插件

$ ./certbot-auto --nginx         

使用该插件,会自动扫描nginx的所有配置文件,交互式选择所有需要的域名并生成证书,不需要占用端口。基本做到一键配置https!

nignix插件会自动更新配置文件,增加如下内容

listen      443 ssl;                                                 # managed by Certbot
ssl_certificate /etc/letsencrypt/live/huhao.ai/fullchain.pem;    # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/huhao.ai/privkey.pem;  # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf;                    # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;                      # managed by Certbot

其中options-ssl-nginx.conf包含的内容

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_ciphers "ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

添加证书自动更新到cron

$ sudo crontab -e
0 */12 * * * /opt/certbot/certbot-auto -q renew --nginx && systemctl reload nginx

其他用法

调整证书的位置并修复链接

当修改了 /etc/letsencrypt/archive/中的证书的位置时,可以利用 certbot的命令 update_symlinks 自动更新live目录的所有文件的链接
方法1:

$ mv /etc/letsencrypt/archive/example.com /home/user/me/certbot/example_archive
$ sed -i 's,/etc/letsencrypt/archive/example.com,/home/user/me/certbot/example_archive,' /etc/letsencrypt/renewal/example.com.conf
$ mv /etc/letsencrypt/live/example.com/*.pem /home/user/me/certbot/
$ sed -i 's,/etc/letsencrypt/live/example.com,/home/user/me/certbot,g' /etc/letsencrypt/renewal/example.com.conf

方法2

$ ./certbot-auto update_symlinks

其他命令

$ ./certbot-auto certificates       #查看本机的证书

测试https连接

浏览器访问 https://www.ssllabs.com/ssltest/analyze.html?d=huhao.ai

load balance配置https证书

需要在load balancer和所有主机上都安装同样的证书。生成过程可以在一个机器上完成,之后要进行证书分发(copy)

nginx完整配置文件一览:以docker gitlab为例

upstream gitlab {
    server 127.0.0.1:8088;
}

server {
    listen      443 ssl;
    server_name huhao.ai;

    access_log  /var/log/nginx/gitlab.access.log;
    error_log   /var/log/nginx/gitlab.error.log;

    proxy_buffers 16 64k;
    proxy_buffer_size 128k;

    add_header Strict-Transport-Security "max-age=31536000";
    ssl_certificate /etc/letsencrypt/live/huhao.ai/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/huhao.ai/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass  http://gitlab;
        #proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;

        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        #proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
    }
}

server {
    if ($host = gitlab.huhao.ai) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen      80;
    server_name gitlab.huhao.ai;
    return 404; # managed by Certbot
}

参考