白小兔的小小站

既然选择了远方,便只顾风雨兼程

0%

安全证书申请与网站HTTPS配置

之前是使用的certbot申请的Let’s Encrypt的证书,最近快到期了,今天把证书申请脚本换成了acme.sh,这个脚本默认的CA提供商是ZeroSSL。这里只是简单记录下今天安装acme.sh的过程,像自动续期等功能没去花精力折腾,快到期了上机器手动执行下脚本也还好

软件安装

  1. 安装socat

    1
    dnf install socat

    这个软件是acme.sh建议安装的,用于支持standalone方式获取证书,具体的我没有试验过

  2. 从域名提供商获取DNS的访问Key(各提供商的地址参考资料1), 然后将Key写入环境变量

    1
    2
    3
    4
    5
    6
    #定义一个用于放环境变量的文件
    vi /etc/profile.d/example.sh
    #写入Key,注意这个Key应该要有读写权限,别只弄个只读的Key
    export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
    #保存,然后使用以下命令让环境变量生效
    source /etc/profile
  3. 通过env命令查看环境变量是否确实生效

  4. 安装acme.sh

    1
    curl https://get.acme.sh | sh -s [email protected]

    注意这里邮箱是有必要填写的,安装完毕后关闭终端,重新登录。

  5. 无论是否对申请证书有帮助,先开启80和443端口

    1
    2
    3
    4
    5
    6
    7
    8
    #查询80端口是否打开
    firewall-cmd --zone=public --query-port=80/tcp
    #打开80端口
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    #打开443端口
    firewall-cmd --zone=public --add-port=443/tcp --permanent
    #更新防火墙规则
    firewall-cmd --reload
  6. 执行脚本生成证书(默认CA是ZeroSSL,上面填写的邮箱会被用来注册ZeroSSL账号)

    1
    acme.sh --issue --dns dns_namesilo --dnssleep 500 -d example.com -d *.example.com

    指定CA

    1
    acme.sh --issue --dns dns_namesilo --dnssleep 500 --server letsencrypt -d example.com -d *.example.com

    如果要更换默认CA,可以通过以下命令,以letsencrypt为例

    1
    acme.sh --set-default-ca --server letsencrypt

    这里的500是等待TXT记录生效的一个时间,实践下来发现好像不能搞太长了,否则会报Timeout错误,用于CA证书提供商来验证我们的域名归属,一般我们通过以下命令查看TXT证书是否已生效

    1
    nslookup -qt=txt _acme-challenge.example.com

    如果实际操作中发现900秒不足以使得执行以上命令时能拿到最新的TXT记录,则需要相应地调长这个等待时间

    异常情况:

    1. 如果修改了步骤2中的环境变量的值,则需要进入.acme.sh/文件夹修改account.conf文件中的对应变量值,否则脚本将一直使用旧值,导致DNS记录修改失败,特别坑

    2. 如果显示Processing, The CA is processing your order, please just wait. (29/30), 最终提示Timeout,证书申请失败,临时关闭下防火墙,弄完后再打开(先不要关闭防火墙,实在不行了再用这招试试)

      1
      systemctl stop firewalld.service
  7. 配置Nginx,在配置文件的server下添加以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    server_name example.com;
    listen 443 ssl http2;
    ssl on;
    root /usr/share/nginx/html;
    index index.html;
    #SSL 证书文件路径,由证书签发机构提供
    ssl_certificate /etc/nginx/cert/cert.pem;
    #SSL 密钥文件路径,由证书签发机构提供
    ssl_certificate_key /etc/nginx/cert/cert.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    #ssl_ciphers配置较长,这里删除了
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;
    ssl_buffer_size 1400;
    ssl_stapling on;
    ssl_stapling_verify on;
    #国内填 223.5.5.5 223.6.6.6,国外填 8.8.4.4 8.8.8.8
    resolver 8.8.4.4 8.8.8.8 valid=300s;
    resolver_timeout 5s;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
    add_header X-Content-Type-Options "nosniff";
    add_header X-Frame-Options "DENY";
    add_header X-XSS-Protection "1; mode=block";
  8. 安装证书到指定路径并重启Nginx

    1
    2
    3
    4
    acme.sh  --install-cert -d example.com \
    --key-file /etc/nginx/cert/cert.key \
    --fullchain-file /etc/nginx/cert/cert.pem \
    --reloadcmd "service nginx force-reload"
  9. 手动续期

    1
    acme.sh --renew -d example.com --force
  10. 更新acme.sh

    1
    acme.sh  --upgrade  --auto-upgrade

参考资料

  1. dnsapi配置说明
  2. acme.sh安装说明