Let's Encrypt 证书 SSL通用证书 配置与自动续期

[隐藏]

《Let's Encrypt 证书 SSL通用证书 配置与自动续期》

什么是 Let’s Encrypt?

部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的!!!也就是说签发证书不需要任何费用。Let’s Encrypt 由于是非盈利性的组织,需要控制开支,他们搞了一个非常有创意的事情,设计了一个 ACME 协议,目前该协议的版本是 v1。

那为什么要创建 ACME 协议呢,传统的 CA 机构是人工受理证书申请、证书更新、证书撤销,完全是手动处理的。而 ACME 协议规范化了证书申请、更新、撤销等流程,只要一个客户端实现了该协议的功能,通过客户端就可以向 Let’s Encrypt 申请证书,也就是说 Let’s Encrypt CA 完全是自动化操作的。

任何人都可以基于 ACME 协议实现一个客户端,官方推荐的客户端是 Certbot

什么是通配符证书

在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。

  • 单域名证书:证书仅仅包含一个域名。

  • SAN 证书:一张证书可以包括多个域名 Let’s Encrypt 限制是 20),也就是证书可以包含下列的域名:www.example.com、www.example.cn、blog.example.com 等等。

Let’s Encrypt 通配符证书

通配符证书就是证书中可以包含一个通配符,比如 .example.com、.example.cn,企业可以使用通配符证书,一张证书可以放置在更多的子域名。

自动生成 Let’s Encrypt 通配符证书

为了实现通配符证书,Let’s Encrypt 对 ACME 协议的实现进行了升级,只有 v2 协议才能支持通配符证书。也就是说任何客户端只要支持 ACME v2 版本,就可以申请通配符证书。

下载安装 Certbot 客户端

cd  /usr/local/ 
git https://github.com/certbot/certbot.git

生成通配符证书

./certbot-auto certonly --email 7731226@qq.com -d *.heguangzhi.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

certonly 表示安装模式,Certbot 有安装模式和验证模式两种类型的插件。

–manual 表示手动安装插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择

-d 为那些主机申请证书,如果是通配符,输入 *.xxxx.com (可以替换为你自己的域名)

–preferred-challenges dns,使用 DNS 方式校验域名所有权

–server, Let’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。

操作交互流程

  • 是否同意 Let’s Encrypt 协议要求
  • 询问是否对域名和机器(IP)进行绑定
  • 域名验证 dns 解析增加 TXT 配置
Please deploy a DNS TXT record under the name
_acme-challenge.heguangzhi.com with the following value:

2_8KBE_jXH8nYZ2unEViIbW52LhIqxkg6i9mcwsRvhQ

要求配置 DNS TXT 记录,从而校验域名所有权,也就是判断证书申请者是否有域名的所有权。
上面输出要求给 _acme-challenge.newyingyong.cn 配置一条 TXT 记录,在没有确认 TXT 记录生效之前不要回车执行。

dig -t txt _acme-challenge.heguangzhi.com @114.114.114.114

创建成功 /etc/letsencrypt/live/heguangzhi.com/ 下会生成 4 个文件,请勿更改 ssl 文件位置,这样可以减少自动续期时的操作

cert.pem  - Apache服务器端证书  
chain.pem  - Apache根证书和中继证书  
fullchain.pem  - Nginx所需要ssl_certificate文件  
privkey.pem - 安全证书KEY文件
Nginx 环境,就只需要用到fullchain.pem和privkey.pem两个证书文件

测试证书

openssl x509 -in /etc/letsencrypt/live/heguangzhi.com/fullchain.pem -noout -text

Nginx SSL 配置

  1. 增加 443 端口监听
    listen 443 ssl;
    
  2. 增加 ssl 配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ssl_prefer_server_ciphers on;
    ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;
    ssl_session_timeout 5m;
    ssl_session_tickets on;
    ssl_stapling on;
    ssl_stapling_verify on;
    
  3. HTTP 强制跳转 HTTPS
    server
        {
            listen 80 ;
            server_name www.xxxx.com;
            rewrite ^(.*)$  https://$host$1 permanent; 
        }
    
  4. Nginx 重新加载配置
    nginx reload  
    
  5. 完整的 Nginx 配置文件
    server {
            listen 80 ;
            server_name www.heguangzhi.com heguangzhi.com;
            rewrite ^(.*)$  https://$host$1 permanent; 
    }
    
    
    server {
            listen 443 ssl;
    
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
            ssl_session_cache builtin:1000 shared:SSL:10m;
            resolver 8.8.8.8 8.8.4.4 114.114.114.114 valid=300s;
            resolver_timeout 5s;
            ssl_prefer_server_ciphers on;
            ssl_certificate /etc/letsencrypt/live/heguangzhi.com/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/heguangzhi.com/privkey.pem;
            ssl_session_timeout 5m;
            ssl_session_tickets on;
            ssl_stapling on;
            ssl_stapling_verify on;
    
    
            ## Your website name goes here.
            server_name www.heguangzhi.com heguangzhi.com;
            ## Your only path reference.
            root /www.heguangzhi.com/wordpress;
            ## This should be in your http block and if it is, it's not needed here.
            index index.php;
    
            location = /favicon.ico {
                    log_not_found off;
                    access_log off;
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
            location / {
                    # This is cool because no php is touched for static content.
                    # include the "?$args" part so non-default permalinks doesn't break when using query string
                    try_files $uri $uri/ /index.php?$args;
            }
    
            location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
            }
    
            location ~* \.(png|jpg|jpeg|gif|ico)$ {
                    expires max;
                    #log_not_found off;
            }
        error_log  /var/log/nginx/www.heguangzhi.com.error.log;
        access_log  /var/log/nginx/www.heguangzhi.com.access.log  main;
    }
    
    

在了解该协议之前有几个注意点:

  1. 客户在申请 Let’s Encrypt 证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式:
    • dns-01:给域名添加一个 DNS TXT 记录。
    • http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件。
    • tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。
      而申请通配符证书,只能使用 dns-01 的方式
  2. ACME v2 和 v1 协议是互相不兼容的,为了使用 v2 版本,客户端需要创建另外一个账户(代表客户端操作者),以 Certbot 客户端为例,大家可以查看:


[root@232ifeefdf]# tree /etc/letsencrypt/accounts /etc/letsencrypt/accounts └── acme-v02.api.letsencrypt.org └── directory └── 2ce229c707caaf75377a74654d7824e4 ├── meta.json ├── private_key.json └── regr.json

自动申请通配符证书

在 Certbot 官方提供的插件和 hook 例子中,都没有针对国内 DNS 服务器的样例,certbot-letencrypt-wildcardcertificates-alydns-au 工具,支持阿里云 DNS 和腾讯云 DNS。

参考文章请看:https://hacpai.com/article/1531709298417

  1. 下载工具
    $ git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
    
    $ cd certbot-letencrypt-wildcardcertificates-alydns-au
    
    $ chmod 0777 au.sh autxy.sh python-version/au.sh
    
  2. 配置工具

    目前该工具支持三种运行环境:

    • au.sh:操作阿里云 DNS hook shell(PHP 环境)。
    • autxy.sh:操作腾讯云 DNS hook shell(PHP 环境)。
    • python-version/au.py:操作阿里云 DNS hook shell(Python 2.7/3.6),感谢 @Duke-Wu 的 PR。
      这三种运行环境什么意思呢?就是可根据自己服务器环境和域名服务商选择任意一个 hook shell(操作的时候任选其一即可)。

    DNS API 密钥:

    alydns.php,修改 accessKeyId、accessSecrec 变量,阿里云 API key 和 Secrec 官方申请文档
    txydns.php,修改 txyaccessKeyId、txyaccessSecrec 变量,腾讯云 API 密钥官方申请文档
    python-version/alydns27.py,修改 ACCESS_KEY_ID、ACCESS_KEY_SECRET,阿里云 API key 和 Secrec 官方申请文档
    这个 API 密钥什么意思呢?由于需要通过 API 操作阿里云 DNS 或腾讯云 DNS 的记录,所以需要去域名服务商哪儿获取 API 密钥。

  3. 申请证书
    特别说明: –manual-auth-hook 指定的 hook 文件三个任选其一(au.sh、autxy.sh、python-version/au.sh),其他操作完全相同。

    # 测试是否有错误
    $ ./certbot-auto certonly  -d *.example.com --manual --preferred-challenges dns  --manual-auth-hook /脚本目录/au.sh(autxy.sh 或 python-version/27.py,下面统一以 au.sh 介绍)  --dry-run  
    
    # 实际申请
    $ ./certbot-auto certonly  -d *.example.com --manual --preferred-challenges dns  --manual-auth-hook /脚本目录/au.sh    
    

    如果你想为多个域名申请通配符证书(合并在一张证书中,也叫做 SAN 通配符证书),直接输入多个 -d 参数即可,比如:

    $./certbot-auto certonly  -d *.example.com -d *.example.org  --manual --preferred-challenges dns  --manual-auth-hook /脚本目录/au.sh  --dry-run  
    

续期证书

  1. 对机器上所有证书 renew
    $ ./certbot-auto renew --manual --preferred-challenges dns --manual-auth-hook /脚本目录/au.sh
  2. 对某一张证书进行续期

    先看看机器上有多少证书:

    $ ./certbot-auto certificates
    

    可以看到很多证书,如图:

    Upgrading certbot-auto 0.26.1 to 0.27.1...
    Replacing certbot-auto...
    Creating virtual environment...
    Installing Python packages...
    Installation succeeded.
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Found the following certs:
      Certificate Name: heguangzhi.com
        Domains: *.heguangzhi.com
        Expiry Date: 2018-12-02 08:32:01+00:00 (VALID: 63 days)
        Certificate Path: /etc/letsencrypt/live/heguangzhi.com/fullchain.pem
        Private Key Path: /etc/letsencrypt/live/heguangzhi.com/privkey.pem
      Certificate Name: phabricator.cn
        Domains: *.phabricator.cn
        Expiry Date: 2018-12-02 09:13:50+00:00 (VALID: 63 days)
        Certificate Path: /etc/letsencrypt/live/phabricator.cn/fullchain.pem
        Private Key Path: /etc/letsencrypt/live/phabricator.cn/privkey.pem
    

    记住证书名,比如 heuangzhi.com ,然后运行下列命令 renew:

    $ ./certbot-auto renew --cert-name simplehttps.com  --manual-auth-hook /脚本目录/au.sh 
    
  3. 加入 crontab
    编辑文件 /etc/crontab :
    1 1 */1 * * root certbot-auto renew --manual --preferred-challenges dns --manual-auth-hook /脚本目录/au.sh
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注