SSL证书Let's Encrypt自动申请脚本 ,对接域名解析商支持免费泛域名

Let’s Encrypt虽说是一个免费项目,但它由Linux基金会托管,Mozilla、思科、Akamai、IdenTrust 和EFF等组织发起,后有Facebook等大佬加入,颁发的证书的权威性和可靠性就不用多说了。不仅免费还支持泛域名简直不能再爱了❥(^_-)。

Let’s Encrypt证书一开始比较难用繁琐,然后推出了certbot工具实现了一键申请证书、自动部署Nginx、Apache、到期自动续期等功能,易用性大大提高。众所周知申请证书之前需要安装域名所有权,这有两种方式:

  • html文件验证
  • 域名TXT验证

第一种html验证需要先去域名解析商把域名解析到网站ip,手头没有现成网站就只能采取第二种TXT验证,就需要去域名解析商添加随机指定的TXT记录。两种方式都要经过域名解析商,输入密码登录然后添加解析也算是较为繁琐的步骤。这里介绍acme.sh脚本,可以直接对接你的域名服务商无需登录手动添加解析,实现了比certbot还要”一键“的一键脚本。

Let’s Encrypt证书被国外广泛接受,但是我们国内好像不太认可。360这玩意竟然在360浏览器里直接把Let’s Encrypt证书标记为不信任,但对亚洲诚信TRUSTAsia证书放行;国外正好相反,不信任TRUSTAsia但完全信任Let’s Encrypt。所以国内建站Let‘s Encrypt还是要考虑一下。

安装

一句话命令

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

此命令一共做了两件事:

  1. 把acme.sh脚本存放到了你当前用户目录下的.acme.sh目录下

    ~/.acme.sh/

    然后创建了一个别名alias,你可以在任何地方直接调用acme.sh脚本

    alias acme.sh=~/.acme.sh/acme.sh
  2. 创建了一个定时任务crontab,每天00:00自动检测所有证书,快到期的证书自动续签。
    此脚本的所有的修改都限制在安装目录中: ~/.acme.sh/

生成证书

html和TXT两种方式都支持。

html验证

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

-d参数指定申请证书的域名,可以指定多个。–webroot参数指定域名对应网站的根目录。acme.sh 会在根目录下全自动生成验证文件以验证网站所有权,完成验证后自动删除验证文件。

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

如果你的web服务器是apache,那么使用–apache参数无需指定网站根目录。

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

效果同上,web服务器是nginx。

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

如果你没有安装运行任何web服务,使用–standalone参数可以帮助你临时创建一个web服务以帮助你完成验证。

TXT验证

TXT验证分为两种,手动和自动,这里讨论自动为主,手动略写。

  1. 手动TXT

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

    使用–dns参数指定用dns方式——即TXT验证,acme.sh 会生成一条解析记录显示出来, 把解析添加到域名 txt 记录里,然后重新生成证书:

    acme.sh  --renew   -d mydomain.com
  2. 自动TXT
    以腾讯云dnspod为例:
    登录dnspod生成api id和api key,然后导入系统配置

    export DP_Id="你的api id"
    export DP_Key="你的api key"

    导入后直接开始申请

    acme.sh   --issue   --dns dns_dp   -d aa.com  -d www.aa.com

    使用–dns参数指定域名解析商,dns_dp指的是腾讯云。-d参数指定申请证书的域名。此命令会自动在你腾讯云处的域名下生成TXT解析以完成验证,完成验证后自动删除TXT解析并完成证书申请。Let’s Encrypt证书有效期为3个月,在证书快要到期时自动续期,完全的自动化,nice!

域名解析商导入方法

放几个常用的域名解析商的api生成地址和要导入的变量名:

  1. CloudFlare
    CloudFlare只有api key,api id就是你注册的邮箱了。获取你的CloudFlare的api key
    export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
    export CF_Email="xxxx@sss.com"
    acme.sh --issue --dns dns_cf -d example.com -d www.example.com
  2. DnsPod
    腾讯云的dns解析。
    export DP_Id="1234"
    export DP_Key="sADDsdasdgdsf"
    acme.sh --issue --dns dns_dp -d example.com -d www.example.com
    3、GoDaddy
    GoDaddy的api id和api key申请地址:这里
    export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
    export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
    acme.sh --issue --dns dns_gd -d example.com -d www.example.com
  3. Amazon
    Amazon的dns解析叫做Route53,查看这篇文章以获取Route53的api id和api key:如何获取Route53的api
    export  AWS_ACCESS_KEY_ID=XXXXXXXXXX
    export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXX
    acme.sh --issue --dns dns_aws -d example.com -d www.example.com
  4. Aliyun
    阿里云的dns解析,获取api id和api key:这里
    export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
    export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
    acme.sh --issue --dns dns_ali -d example.com -d www.example.com
  5. name.com
    获取name.com的api key:这里,无需api id是你的用户名。
    export Namecom_Username="testuser"
    export Namecom_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    acme.sh --issue --dns dns_namecom -d example.com -d www.example.com
  6. 华为dns
    华为无需api id和api key,需要的是账号的用户名、密码和ProjectID,projectID在这里找到。
    export HUAWEICLOUD_Username=<Your Username> # Usually hwxxxxxx
    export HUAWEICLOUD_Password=<Your Password>
    export HUAWEICLOUD_ProjectID=<A Project ID>
    ./acme.sh --issue --dns dns_huaweicloud -d example.com -d www.example.com
    acme.sh支持100多种域名商接入,更多接入方式看:这里

泛域名证书

-d参数后接域名*.example.com,就能申请example.com的泛域名证书啦。
泛域名证书只能支持“泛一级域名”,也就是说*.example.com证书支持形如:a.example.com、b.example.com、c.example.com,但是无法支持a.a.example.com、b.a.example.com这样再多一级或者多级域名。