使用acme.sh脚本的DNS API方式申请及更新let's encrypt证书

Linux服务器下使用acme.sh脚本是申请let’s encrypt证书最便捷的方式,比官方推荐的certbot脚本工具要强大的多。

安装文档: https://github.com/Neilpang/acme.sh/wiki/说明

前提条件

  • 拥有一个域名,例如mydomain.com (在国内主机的用的话,还需要通过ICP备案)
  • 确定二级域名,并且在域名服务器创建一条A记录,执行云主机的公网IP地址。www.mydomain.com指向xxx.xxx.xxx.xxx的IP地址
  • 要等到新创建的域名解析能在公网上被解析到。
  • 据说国内的域名提供商对letsencrypt的支持非常差,但是现阶段用dnspod解析的域名还没碰到问题。

一、安装acme.sh脚本

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

# 重新登录ssh,或者使用source命令重新加载环境变量
source . 

二、使用DNS API申请证书

(推荐配置使用API的方式,否则每隔三个月,仍然需要重新验证DNS TXT记录)

创建DNS API的Key及Secret

参考:https://github.com/Neilpang/acme.sh/tree/master/dnsapi

【例子一】域名由DNSPod提供解析

  1. 使用DNSPod域名服务的话,首先需要在DNSPod网站上获取API Key以及ID DNSPod申请API-1 DNSPod申请API-2

  2. Linux下使用acme.sh命令申请证书

    export DP_Id="xxxxx"
    export DP_Key="xxxxx"
       
    # 注:-d参数可以多次使用,来实现同时为多个域名创建同一个证书
    acme.sh --issue --dns dns_dp -d mydomain.com -d www.mydomain.com -d blog.mydomain.com --accountemail my@email.com
    #等2分钟
    

【例子二】域名由GoDaddy域名解析的情况

  1. 首先在godday的开发者页面获取API的key https://developer.godaddy.com/keys

    创建API的Key以及Secret Godday申请API-1 Godday申请API-2

  2. Linux下使用acme.sh命令申请证书

    export GD_Key="xxxxx"
    export GD_Secret="xxxxx"
    acme.sh --issue --dns dns_gd -d mydomain.com --accountemail email@mydomain.com
    #等2分钟
    

三、安装证书

# 创建安装目录
mkdir /etc/ssl/mydomain.com/ -p

# reloadcmd参数里面填写的是在更新证书后需要重新启动的服务,例如重启nginx或者apache或者其它脚本。
acme.sh --installcert -d mydomain.com   \
        --keypath /etc/ssl/mydomain.com/privkey.pem \
        --fullchainpath /etc/ssl/mydomain.com/fullchain.pem \
        --reloadcmd "systemctl reload nginx"

四、应用实例:配置nginx使用证书开通https站点

  1. 生成Perfect Forward Security(PFS)键值

    Perfect Forward Security(PFS)是个什么东西,中文翻译成完美前向保密,一两句话也说不清楚,反正是这几年才提倡的加强安全性的技术。如果本地还没有生成这个键值,需要先执行生成的命令。

    mkdir /etc/ssl/private/ -p
    cd /etc/ssl/private/
    openssl dhparam 2048 -out dhparam.pem
    

    生成的过程还挺花时间的,喝杯咖啡歇会儿吧。

  2. 配置使用证书。例如:Nginx配置SSL网站: /etc/nginx/conf.d/www.mydomain.com.conf,样例内容如下:

    server {
      listen 80;
      server_name www.mydomain.com;
      rewrite ^ https://$server_name$request_uri? permanent;
    }
       
    server {
        listen 443 ssl;
        server_name www.mydomain.com;
           
        charset utf-8;
        root /opt/www/www.mydomain.com;
        index index.html index.htm;
       
        access_log  /var/log/nginx/www.mydomain.com_access.log;
        error_log  /var/log/nginx/www.mydomain.com_error.log;
           
        # letsencrypt生成的文件
        ssl_certificate /etc/ssl/mydomain.com/fullchain.pem;
        ssl_certificate_key /etc/ssl/mydomain.com/privkey.pem;
           
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets on;
       
        ssl_dhparam /etc/ssl/private/dhparam.pem;
       
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
        ssl_prefer_server_ciphers on;
    

在浏览器打开http://www.mydomain.com, 如果正常跳转到https://demo.mydomain.com,就算成功了。 如果是chrome浏览器,在地址栏点击小锁的图标,可以查看证书的详情。

五、测试证书

如果是网站的话,可以使用第三方网站工具测试自己网站的HTTPS配置
https://ssllabs.com/ssltest/analyze.html?d=mydomain.com

也可以在Linux下使用openssl命令查看证书的过期时间

openssl x509 -noout -dates -in /etc/ssl/mydomain.com/privkey.pem      

六、确认crontab自动更新脚本

正常情况下acme.sh会自动安装以下定时任务,如果没有的话,需要手工添加

0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
Share Comments
comments powered by Disqus