使用acme.sh自动续期DV证书

技术安全
背景

当前的互联网环境下,为我们的站点部署一个ssl证书,通常有以下几点原因:

  1. 在一定程度上保证数据传输的安全(注意,并不能保证用户信息不被泄露);
  2. 现在主流浏览器对于没有部署证书的域名会显示一个“不安全”的标识,即便你网站做的再尽善尽美,没有证书照样给你打上这个title,非常的扎眼;
  3. 再有就是当我们的站点需要对接一些开放平台的接口时,绝大部分平台都要求接入方的地址是https站点。

在以前,我们申请证书的操作通常都是手动完成,通常的步骤是

  1. 先去证书颁发机构的代理站点申请证书,需要提供域名信息
  2. 根据代理机构提供的解析内容,一般是cname或者txt类型,到域名解析机构新增对应的解析
  3. 验证通过后,下载我们需要证书类型,包括nginx,apache,iis等
  4. 将证书部署到web站点

虽然流程也是比较简单,但还是需要手动修改一些东西,对应到实际的公司环境,很可能还涉及到一些非技术层面的沟通工作,导致证书的部署流程并没有我们想想的那般顺畅。

为了解决这个问题,或者说为了在一定程度上缓解这个问题,一般有以下几种做法

  1. 购买多年份付费证书
  2. 绑定某一大厂云平台,流水线式部署
  3. 利用acme协议,完成证书的自动续期

那三种方案也都有各自的优缺点,

第一种的缺点很明显,就是无法完全避免手动操作,只是拉长的间隔。优点就是可以根据实际需求,灵活的选择各种类型证书,dv(免费或者便宜),ov(贵),ev(特别贵,申请特别难)。

第二种的话,其实最接近零配置方案,缺点就是和大厂服务深度绑定,比如域名在阿里云申请,证书也要在阿里云买,服务器也要在阿里云。

第三种的缺点就是目前来说只支持dv证书,再有就是需要一点点开发成本,优点就是,如果不考虑更换证书类型,可以说是接近一劳永逸了。

有免费的dv证书为啥还要用收费的ov,ev类证书呢?

这一点有疑问的小伙伴可以搜一搜,事实上我认为dv证书就可以满足绝大多数场景了,即便是Google,Redis这类大厂的官网,用的证书,也是dv证书哦!但国内的好多站点,即便是小厂,有的也要上ov甚至ev证书,多少有点面子工程了~。

感兴趣的小伙伴,可以到这里查看你想查的网站用的那种证书:https://myssl.com/,我这里放一张redis官网的证书报告

picture.image

前置条件

1、域名

首先要准备一个自己可以操作,或者很方便让别人来替你操作的域名。最好是申请一个自己的,平时测试什么的可以直接拿来用,一年也用不了多少钱,我这自己的这个,每年十几块钱。

picture.image

2、服务器

最好是有一台自己的专属云服务器,原因无他,也是为了方便,毕竟在自己的服务器上乱搞也不怕搞坏了,大不了重装系统。这个成本稍微高点,但目前各大平台对新用户还是很照顾的,基本都是 100 块钱以内 1 年,到期了不行就换平台呗,这么多平台呢,轮着薅

picture.image 配置环境 本文以 debian 操作系统为例,演示通过部署 acme.sh 脚本来自动颁发并安装证书。这里我的证书颁发机构是 freessl,国内大平台

*安装 Nginx

这一步不是必须的,但我们的站点需要有一个 web 服务器,除了 nginx,也可以用 apace 等其他 web 服务,我这里以 nginx 为例。

apt-get update
apt-get install -y nginx

安装完成后,检测安装效果

picture.image

安装 acme.sh

curl https://get.acme.sh | sh -s email=your@email.com

安装完成后,页面会有相应提示,如果系统没有安装 socat,控制台上会提示安装 socat,具体原因控制台上也有输出。

这里因为我的云服务器上已经安装过了,为了再次展示这个安装提示,我在本地的 subsystem 上又安装了一下,打印了这个输出。

picture.image

颁发证书

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。所以我们最好从 letsencrypt 的直属证书颁发机构去申请证书,我这里使用的是 freessl(传送门:https://freessl.cn/

这里也可以用其他平台,只要支持自动续期的服务就都可以,这里有个小伙伴用的阿里云的方案

配置解析

登录完成后,进入【ACME 自动化】界面,添加域名,根据提示一步步完成操作,注意这里的配置 cname 解析需要到自己的域名服务商那里去配置;

picture.image

picture.image

安装脚本

dvc 验证通过后,freessl 会自动生成 acme.sh 的部署脚本,直接复制该脚本到目标服务器执行即可。

picture.image 到这里,我们就可以拷贝这条命令,回到云服务器的控制台,部署安装了

picture.image 注意,这里安装的时候,可能会出现一些 504 之类的错误(如下图👇),如果不是环境安装失败的话,一般就是网络问题,多试几次就可以了。

picture.image 安装成功后,acme.sh 脚本可以设置成自动升级的模式

acme.sh --upgrade --auto-upgrade

picture.image

配置 nginx

安装成功后,控制台会打印出证书文件的存放路径,然后就可以部署到 nginx 了

acme.sh --install-cert -d example.com \
--key-file       /{控制台打印出来的实际路径}  \
--fullchain-file /{控制台打印出来的实际路径} \
--reloadcmd     "service nginx force-reload"

执行截图如下

picture.image 这里注意,我们只是生成了适用于 nginx 的 dv 证书文件,要完整最后的 https 配置,还是要自己修改 nginx 的配置文件的。

server {
        listen  443 ssl http2;
        listen  [::]:443 ssl http2;
        server_name     www.tonydf.cn;
        root    /usr/share/nginx/html;

        ssl_certificate         "{上面控制台提示fucallchain文件的地址}";
        ssl_certificate_key     "{上面控制台提示key文件的地址,}";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout     10m;
        ssl_ciphers     HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
}

好了,至此,我们的配置工作就基本完成了,验证一下成果

picture.image

picture.image

picture.image

总结

至此,acme 配置自动办法证书的工作就完成了,关于 acme.sh 的更多用法,可以参考其官方仓库,传送门👉:https://github.com/acmesh-official/acme.sh

ps:本文同步发表于InfoQ:https://xie.infoq.cn/article/e87c899c13adbdb779e07e365

CSDN:https://blog.csdn.net/juanhuge/article/details/134975450

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论