zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    火狐插件火狐黑客插件将Firefox变成黑客工具的七个插件
    memcache安装环境:WINDOWS 7
    PHP正则表达式
    968. 监控二叉树 力扣(困难) dfs 官方说DP
    375. 猜数字大小 II 力扣(中等) 区间动态规划、记忆化搜索
    629. K个逆序对数组 力扣(困难) 区间动态规划
    剑指 Offer 51. 数组中的逆序对 力扣(困难) 巧用归并排序算法
    488. 祖玛游戏 力扣(困难) dfs
    16. 最接近的三数之和 力扣(中等) 双指针
    319. 灯泡开关 力扣(中等) 数论
  • 原文地址:https://www.cnblogs.com/kika/p/10851606.html
Copyright © 2011-2022 走看看