• Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)


    单域名证书的生成可以 参考这里
    acme.sh 项目中文文档

    Let’s Encrypt 在 18 年 1 月份推出了 ACME v2,支持通配符域名证书,对小网站、个人站长的友好度进一步增加。

    常用的两种安装方式对比

    ACME 协议支持的验证协议一般有两种:

    • http 验证:必须有可以正常运行的服务器和公网 IP。验证时,需要在你的网站根目录下放一个文件来验证域名所有权,完成验证后就可以生成证书了。
    • dns 验证:不需要服务器和公网 IP。只需要为域名添加一条 txt 解析记录来验证域名所有权。

    Let’s Encrypt 通配符证书的两种安装方式:

    • acme.sh:对于 http 验证,会自动在网站根目录生成验证文件, 然后自动完成验证,最后自动删除验证文件。对于 dns 验证,如果域名解析商提供 API,则可以自动借助这个 API 通过工具添加 txt 记录完成验证(如果不提供 API 则无法自动化,目前腾讯云、阿里云都支持)。此外,还会自动生成更新域名的定时任务。
    • certbot-auto:对于域名验证这一步,需要手工操作。且更新域名的定时任务也需要自己写。

    通过 acme.sh 获取通配符域名证书

    acme.sh 的所有相关文件(包括安装文件、申请到的证书等)都在 ~/.acme.sh/ 这一个目录中。

    安装 acme.sh

    在线安装

    在线安装的项目地址

    curl https://get.acme.sh | sh

    或者:

    wget -O -  https://get.acme.sh | sh

    从 Git 安装

    下载项目并安装:

    git clone https://github.com/Neilpang/acme.sh.git
    cd ./acme.sh
    ./acme.sh --install

    更多高级安装方式可以 参考这里

    安装过程包含 3 个动作:

    • 创建并复制 acme.sh 到你的家目录 $HOME~/.acme.sh/。所有的证书都会放到这个目录中
    • 创建别名: acme.sh=~/.acme.sh/acme.sh
    • 创建每天的定时任务检查证书,如果快要到期了会自动更新

    定时任务示例:

    0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

    验证

    安装完成后,需要重新打开终端,acme.sh 命令才能生效。

    root@v1:~# acme.sh -h

    生成证书

    http 方式

    acme.sh 会自动在网站根目录生成验证文件, 然后自动完成验证,最后自动删除验证文件。

    需要指定域名和域名对应的网站根目录:

    acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

    对于 nginx 服务器,acme.sh 还可以智能的从 nginx 配置中自动完成验证,不需要指定网站根目录:

    acme.sh --issue  -d mydomain.com   --nginx

    域名获取后,需要手动修改 Nginx 配置文件。

    如果没有运行任何 web 服务,80 端口是空闲的,那么 acme.sh 可以运行为 webserver,临时监听 80 端口,完成验证:

    acme.sh  --issue -d mydomain.com   --standalone

    dns 方式

    如果域名解析商提供 API,则可以自动借助这个 API 通过工具添加 txt 记录完成验证。

    • 对于阿里云:
    # 替换成从阿里云获取的 API 参数
    export Ali_Key="666"
    export Ali_Secret="888"
    # 换成自己的域名
    acme.sh --issue --dns dns_ali -d kikakika.com -d *.kikakika.com
    • 对于腾讯云:
    # 替换成从 DNSPod 获取的 API 参数
    export DP_Id="1234"
    export DP_Key="sADDsdasdgdsf"
    
    # 换成自己的域名
    acme.sh --issue --dns dns_dp -d kikakika.com -d *.kikakika.com

    DNS 生效需要一段时间,acme.sh 设置的是等待两分钟。

    acme.sh 会保存 API 参数并生成定时任务,用于每天验证证书是否即将过期,并及时更新。下面是通过 crontab -e 看到的新增的定时任务:

    16 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

    安装证书

    证书生成后,需要把证书 copy 到真正需要用它的地方。

    默认生成的证书都放在安装目录 ~/.acme.sh/ 下,但是请不要直接使用。而是使用 --installcert 命令安装证书。

    使用 --installcert 命令安装证书

    使用 --installcert 命令安装证书时,证书文件会被复制到相应的位置:

    acme.sh  --installcert  -d  kikakika.com   
            --key-file   /etc/nginx/ssl/kikakika.key 
            --fullchain-file /etc/nginx/ssl/fullchain.cer 
            --reloadcmd  "systemctl reload nginx.service"

    示例:

    [root@VM_139_74_centos ~]# acme.sh  --installcert  -d  kikakika.com   
    >         --key-file   /etc/nginx/ssl/kikakika.key 
    >         --fullchain-file /etc/nginx/ssl/fullchain.cer 
    >         --reloadcmd  "systemctl reload nginx.service"
    [Tue May 22 16:35:20 CST 2018] Installing key to:/etc/nginx/ssl/kikakika.key
    [Tue May 22 16:35:20 CST 2018] Installing full chain to:/etc/nginx/ssl/fullchain.cer
    [Tue May 22 16:35:20 CST 2018] Run reload cmd: systemctl reload nginx.service
    [Tue May 22 16:35:20 CST 2018] Reload success

    当证书更新以后,reloadcmd 中的命令会被自动调用,让服务器加载更新后的证书。

    --installcert 命令可以携带很多参数,来指定目标文件。这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用。

    注意,对于 Nginx,需要通过 systemctl reload nginx.service 来重新加载证书。

    配置 Nginx

    Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer,而非 /etc/nginx/ssl/<domain>.cer,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

    我将所有流量统一导入 https://www.kikakika.com,示例如下:

    server {
        listen 443 ssl;
        server_name www.kikakika.com;
        index index.html;
        root /home/kikakika/www;
    
        ssl on;
        ssl_certificate /etc/nginx/ssl/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/kikakika.key;
        ssl_session_timeout 5m;
    }
    server {
        listen       80;
        server_name  www.kikakika.com;
    
        return 301 https://$host$request_uri;
    }
    server {
        listen  80;
        server_name kikakika.com;
    
        return 301 https://www.kikakika.com$request_uri;
    }
    server {
        listen  443 ssl;
        server_name kikakika.com;
    
        return 301 https://www.kikakika.com$request_uri;
    }

    更新 acme.sh

    手动升级 acme.sh 到最新版:

    acme.sh --upgrade

    可以通过 --auto-upgrade 开启自动升级:

    acme.sh --upgrade --auto-upgrade

    关闭自动更新:

    acme.sh --upgrade --auto-upgrade 0

    吊销证书

    如果申请好的证书不需要了,可以手动进行吊销

    acme.sh --revoke -d kikakika.com -d *.kikakika.com

    示例:

    [root@VM_139_74_centos ~]# acme.sh --revoke -d kikakika.com -d *.kikakika.com
    [Fri Jun  8 15:50:40 CST 2018] Try domain key first.
    [Fri Jun  8 15:50:45 CST 2018] Revoke success.

    常见问题

    遇到问题不要慌,通过 --debug 2 选项可以直接在终端上显示详细日志:

    acme.sh --issue --debug 2 --dns dns_dp -d kikakika.com -d *.kikakika.com

    域名 API 需要登录正确的解析平台开启

    问题描述:获取证书一直失败,分析日志发现有“The login token ID is invalid”这么一句话:

    ...
    [Tue May 22 14:43:48 CST 2018] Http already initialized.
    [Tue May 22 14:43:48 CST 2018] _CURL='curl -L --silent --dump-header /root/.acme.sh/http.header  --trace-ascii /tmp/tmp.LzYzrZRjvQ  -g '
    [Tue May 22 14:43:48 CST 2018] _ret='0'
    [Tue May 22 14:43:48 CST 2018] response='{"status":{"code":"10002","message":"The login token ID is invalid","created_at":"2018-05-22 14:43:50"}}'
    [Tue May 22 14:43:48 CST 2018] invalid domain
    [Tue May 22 14:43:48 CST 2018] Error add txt for domain:_acme-challenge.kikakika.com
    [Tue May 22 14:43:48 CST 2018] pid
    [Tue May 22 14:43:48 CST 2018] No need to restore nginx, skip.
    [Tue May 22 14:43:48 CST 2018] _clearupdns
    [Tue May 22 14:43:48 CST 2018] skip dns.
    [Tue May 22 14:43:48 CST 2018] _on_issue_err
    [Tue May 22 14:43:48 CST 2018] Please check log file for more details: /root/.acme.sh/acme.sh.log
    ...

    后来查找资料才发现,腾讯云和 DNSPod 是两个独立的平台。对于腾讯云上的域名,域名解析并不在腾讯云,仍然需要登录 DNSPod 开启 API:

    这里写图片描述

    登录 DNSPod 添加 API 后,这次就显示“Action completed successful”了。然后等待 120 秒,等 DNS 解析生效:

    [Tue May 22 14:54:12 CST 2018] _postContentType
    [Tue May 22 14:54:12 CST 2018] Http already initialized.
    [Tue May 22 14:54:12 CST 2018] _CURL='curl -L --silent --dump-header /root/.acme.sh/http.header  --trace-ascii /tmp/tmp.rkflZDBcOD  -g '
    [Tue May 22 14:54:13 CST 2018] _ret='0'
    [Tue May 22 14:54:13 CST 2018] response='{"status":{"code":"1","message":"Action completed successful","created_at":"2018-05-22 14:54:15"},"record":{"id":"361406913","name":"_acme-challenge","status":"enabled","weight":null}}'
    [Tue May 22 14:54:13 CST 2018] Sleep 120 seconds for the txt records to take effect

    通配符域名申请的证书,不支持根域名

    问题描述:对 *.kikakika.com 申请了通配符域名,但是在访问 https://kikakika.com 是时候出问题。

    解决办法:必须在申请证书时同时指定根域名 kikakika.com 和通配符域名 *.kikakika.com 两个域名,这样生成的证书才是完整的通配符证书:

    acme.sh --issue --debug 2 --dns dns_dp -d kikakika.com -d *.kikakika.com

    下面是导致出问题的申请通配符证书的命令:

    acme.sh --issue --debug 2 --dns dns_dp -d *.kikakika.com
  • 相关阅读:
    Centos7 ifconfig命令找不到
    request的各种方法
    linux开放端口
    easyui datagrid 部分参数
    设置tomcat内存
    tomcat做成系统服务
    Meta-analysis with complex research designs: dealing with dependence from multiple measures and multiple group comparisons
    多重校正
    DTI
    learning source archive
  • 原文地址:https://www.cnblogs.com/kika/p/10851606.html
Copyright © 2020-2023  润新知