现在的网站基本都是HTTPS协议，在浏览器中看着网站左上角有个小锁（网站连接安全），感觉都不一样。当然这都是小事，主要是想要提升一下资源访问性能，拥抱HTTP/2，但是浏览器就要求必须启用HTTPS才能正常接入HTTP/2。所以，把网站升级到HTTPS是很有必要。网站想要升级到HTTPS，首先得申请下发个安全证书，现在下发证书很简单，方式也很多，很多域名提供商都提供免费证书申请。但是，很多证书都是有时间限制（3个月或者1年），时间到期就需要手动重新，手续麻烦而且还会忘记续期，如果想一劳永逸可以用工具自动生成证书并且自动续租。续租工具和方式也很多，本文将讲解用ACME实现证书申请和证书自动续期。ACME安装curl https://get.acme.sh | sh安装程序会自动做以下操作：自动把 acme.sh 安装到你的 home 的.acme.sh目录下，即~/.acme.sh/自动创建一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.更改默认证书acme.sh --set-default-ca --server letsencryptacme被ZeroSSL收购，其默认的证书方式为ZeroSSL，但此证书生成时会携带邮箱，因此更换为letsencrypt。当然，也可以在生成证书时加一个--server参数来决定生成什么证书--server letsencrypt生成证书使用acme.sh --issue命令生成证书，但生成证书的同时会进行域名的所有权的验证。 acme.sh 有两种方式验证：http 和 dns 验证。注意：如果需要生成泛域名（*.a.com）的证书，不能使用HTTP认证域名，需要改用DNS认证的方式1）http验证方式http方式需要通过或配置网站根目录，命令参数为（--webroot /home/wwwroot/mydomain.com/）或关联服务器的nginx服务，命令参数为（--nginx）或关联服务器的apache服务，命令参数为（--apache）或自建虚拟webserver（服务器没有占用80端口），命令参数为（--standalone）来验证你的域名所有权来完成验证。本服务器已搭建nginx服务，因此关联即可acme.sh --issue -d file.a.com -d www.a.com -d img.a.com --nginx参数解析：--issue命令参数生成证书-d定义需要生成证书的域名，如有多个域名需使用多次，以上定了三个域名：file.a.com/www.a.com/img.a.com三个域名需要配置到nginx中，不一定都配置到同一个server中，所有域名都至少对应一个server，否则无法生成证书... server { listen 80; server_name file.a.com www.a.com img.a.com; } ...如果觉得麻烦可以使用第一种配置网站根目录。或者停止占用80端口的服务，然后通过添加--standalone参数，等生成证书后再启动原来的服务。如果服务器已有80端口的服务，不建议使用自建虚拟webserver，此方式续租时略麻烦需要改造。2）dns 验证方式需要在域名上添加一条 txt 解析记录, 验证域名所有权方式1：手动添加记录生成txt解析内容acme.sh --issue --dns -d mydomain.com \ --yes-I-know-dns-manual-mode-enough-go-ahead-please以上mydomain.com只是测试域名，如果多个域名，则需多次使用-d配置，如-d www.a.com -d img.a.com把txt解析添加到域名管理面板中重新生成证书acme.sh --renew -d mydomain.com \ --yes-I-know-dns-manual-mode-enough-go-ahead-please注意，重新生成使用的是renew参数，把生成txt解析内容命令的issue改为renew方式2：域名提供商api自动解析dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.在域名提供商中，生成你的 api id 和 api key并记录，以dnspod为例引入api id和key，以dnspod为例export DP_Id="1234" export DP_Key="sADDsdasdgdsf"不同提供商，API参数值各不同，可参考下面的表格：自动 DNS API 集成生成证书acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com--dns的配置值也是根据域名提供商来决定，dns_dp表示dnspod。更多参数值可看下方表格表：自动 DNS API 集成服务商名称服务商简称所需API参数获取API参数地址cloudxnscxexport CX_Key="123456" export CX_Secret="abcdef"点击访问dnspod.cndpexport DP_Id="123456" export DP_Key="abcdef"点击访问aliyunaliexport Ali_Key="123456" export Ali_Secret="abcdef"点击访问cloudflarecfexport CF_Key="123456" export CF_Email="abc@example.com"点击访问linodelinodeexport LINODE_API_KEY="123456"点击访问heheexport HE_Username="username" export HE_Password="password"he的用户名密码digitaloceandgonexport DO_API_KEY="123456"点击访问namesilonamesiloexport Namesilo_Key="123456"点击访问awsawsexport AWS_ACCESS_KEY_ID=123456 export AWS_SECRET_ACCESS_KEY=abcdef点击访问namecomnamecomexport Namecom_Username="username" export Namecom_Token="123456"点击访问freednsfreednsexport FREEDNS_User="username" export FREEDNS_Password="password"freedns的用户名密码godaddygdexport GD_Key="123456" export GD_Secret="abcdef"点击访问yandexyandexexport PDD_Token="abcdef"点击访问更多dnsapi的使用，可以查看文档（四）copy/安装 证书默认生成的证书都放在安装目录下: ~/.acme.sh/，但是不要在web服务器中直接引用目录下的证书文件，也不要手动来拷贝证书文件到具体的web服务器中，手动拷贝会导致之后更新证书流程不能完全自动。正确方式是使用acme.sh的安装证书命令，acme.sh自动拷贝证书文件到具体目录中，拷贝命令会被记录下来，之后自动更新证书流程也会执行此拷贝步骤，从而实现更新证书流程的完全自动化。格式例子如下：acme.sh --install-cert -d xxx \ --cert-file xxx \ --key-file xxx \ --fullchain-file xxx\ --reloadcmd xxx根据web服务器需要的文件按需引入对应的参数，reloadcmd定义证书更新后重启对应的web服务命令。以nginx为例：acme.sh --install-cert -d www.a.com -d img.a.com \ --key-file /etc/nginx/cert_file/key.pem \ --fullchain-file /etc/nginx/cert_file/fullchain.pem \ --reloadcmd "service nginx force-reload"（五）web服务使用证书通过上一步安装证书，已经把证书拷贝到目标的目录，接下来就是在web服务中使用证书即可。以nginx为例：... server { listen 443 ssl; ssl_certificate /etc/nginx/cert_file/fullchain.pem; ssl_certificate_key /etc/nginx/cert_file/key.pem; # ... }更新证书目前证书在 60 天以后会自动更新，你无需任何操作，因为在acme.sh安装时，已经把相关的自动更新程序写入到crontab中，如果想要查看，可以通过以下命令：crontab -l输出内容包含一个自动更新程序，大致内容如下：56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null停止自动更新acme.sh --remove -d example.com 或者手动在~/.acme.sh/目录下删除对应的域名目录，如~/.acme.sh/a.com。