使用acme.sh申请更新Let's encrypt证书支持HTTPS

发表于:2019-12-09 13:32:38,已有1944次阅读

在这里使用acme.sh这个Shell脚本客户端来更新获取Let's encrypt证书,相对于Let's Encrypt那个certbot python工具,依赖很多三方库,这个使用更便捷,并且支持泛型域名的DNS记录自助添加和证书的自动更新,纯“傻瓜式”工具。

一、安装

直接在命令行下执行

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

或:

wget -O -  https://get.acme.sh | sh
  1. 这个脚本会把acme.sh安装到当前用户的home目录下:~/.acme.sh/,同时生成的证书也是在这个目录下。
  2. 并创建 一个 bash的alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
  3. 自动为你创建cronjob定时执行任务, 每天0:00点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
    可以通过crontab -l查看可知添加定时任务如下:
    0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

安装完成后执行acme.sh -h来验证acme.sh是否安装成功,如果提示命令没找到,可以重新打开终端或者执行以下指令:

source ~/.bashrc

二、获取证书

acme.sh可以自动配置DNS TXT记录以让Let's encrypt验证当前服务器的所有权,因此不用再手动去域名服务商后台操作解析记录了,相对于certbot方便了不少。
但在使用之前,首先要确认设置你使用的DNS解析服务商的API Token,这里以DNSPod为例,先设置DNSPod.cn域名API使用的token:

然后在命令行中设置你的token:

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"

接着就可以使用acme.sh来自动配置Let's encrypt的通配符证书了:

acme.sh --issue --dns dns_dp -d example.com -d *.example.com

这里的DP_ID和DP_Key将被保存在~/.acme.sh/account.conf,它将在需要时被重用。
可以在acme.sh的wiki查看其支持的dnsapi列表

三、安装证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件,例如: 不要直接让nginx/apache的配置文件使用这下面的文件.
这里面的文件都是内部使用, 而且目录结构可能会变化.正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置.

Apache为例

acme.sh --install-cert -d example.com \
--cert-file      /path/to/certfile/in/apache/cert.pem  \
--key-file       /path/to/keyfile/in/apache/key.pem  \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd     "service apache2 force-reload"

Nginx为例

acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

最后将生成的公䄴与私䄴配置到对应Apache/Nginx配置文件中。

默认情况下,证书将每60天更新一次(这是可配置的)。 证书更新后,将通过以下命令自动重新加载Apache/Nginx服务:service apache2 force-reloadservice nginx force-reload
请注意:reloadcmd非常重要,它让服务器证书自动更新;但是如果reloadcmd没有正确的执行,该证书可能无法刷新到您的服务器(例如nginx或apache),那么您的网站将无法在60天内显示更新的证书。

比如有的Linux用户执行service命令需要sudo命令,如下可以配置sudo让reload服务不需要sudo,例:修改一下 sudoer 文件,让 sudo service nginx force-reload 不需要输入密码:

sudo visudo

打开文件以后新增:

ubuntu  ALL=(ALL) NOPASSWD: /usr/sbin/service nginx force-reload

NOTE: ubuntu 是 acme.sh 安装所用的账号

四、配置HTTPS证书

以nginx为例,要开启SSL十分简单,示例配置文件如下

server { 
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/fullchain/nginx/cert.pem;
    ssl_certificate_key /path/to/keyfile/in/nginx/key.pem;
	# 其他省略
}

但是默认情况下,如果你不给nginx做进一步的安全配置的话,你用SSLLABS来给你刚刚建立的网站来个安全测试,结果一定是这样的

一个大大的B?!
原因是你的diffie-hellman算法强度太低,这个diffie-hellman算法是用来干啥的呢?他的作用就是让访问的者浏览器和你的服务器能安全的交换密钥,具体原理就自行谷歌吧。总之nginx默认采用1024位的diffie-hellman,强度太低太危险,容易被别有用心的黑客叔叔破解,自己生成一个2048位的去替换掉就好啦。

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 # 如果你的机器性能足够强大,可以用 4096 位加密

经过漫长的等待(这就要看你的vps cpu性能如何了),你的目录下面应该已经出现了一个dhparam.pem文件,接下来我们就要修改nginx的配置文件,让他启用我们新生成的diffie-hellman,并且屏蔽容易被攻击的协议。
修改conf文件:

server {
  listen 443 ssl http2;     # 支持http/2
  server_name www.example.com;
  
  ssl_certificate /path/to/fullchain/nginx/cert.pem;    # 公䄴
  ssl_certificate_key /path/to/keyfile/in/nginx/key.pem;   # 私钥
  ssl_dhparam /etc/ssl/certs/dhparam.pem; # 刚刚生成的那个pem文件的路径
  
  ssl_session_cache shared:SSL:10m; # 开启缓存,有利于减少ssl握手开销
  ssl_session_timeout 10m;  # SSL会话过期时间,有利于减少服务器开销
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;# 指定可用的ssl协议,排除sslV3等容易被攻击的协议
  ssl_stapling on;  # 开启证书吊销状态检查
  ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384: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:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"; # 加密顺序,屏蔽不安全的加密方式
  ssl_prefer_server_ciphers on;    # 让服务器决定最佳加密方法
  # 其他省略
}

这里开启了HTTP/2,关于HTTP/2可以查看:https://kiwenlau.com/2019/10/28/speedup-fundebug-by-using-http2/
访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:
https://ssllabs.com/ssltest/analyze.html
确保验证结果有A以上,否则根据提示调整问题:

五、其它

更新 acme.sh
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此acme.sh也经常更新以保持同步.
升级 acme.sh 到最新版 :

acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级(默认acme.sh是开启自动更新的):

acme.sh  --upgrade  --auto-upgrade

之后, acme.sh 就会自动保持更新了.你也可以随时关闭自动更新:

acme.sh --upgrade  --auto-upgrade  0

六、参考

评论

暂无评论

您还可输入120个字