当前的互联网环境下,为我们的站点部署一个ssl证书,通常有以下几点原因:
- 在一定程度上保证数据传输的安全(注意,并不能保证用户信息不被泄露);
- 现在主流浏览器对于没有部署证书的域名会显示一个“不安全”的标识,即便你网站做的再尽善尽美,没有证书照样给你打上这个title,非常的扎眼;
- 再有就是当我们的站点需要对接一些开放平台的接口时,绝大部分平台都要求接入方的地址是https站点。
在以前,我们申请证书的操作通常都是手动完成,通常的步骤是
- 先去证书颁发机构的代理站点申请证书,需要提供域名信息
- 根据代理机构提供的解析内容,一般是cname或者txt类型,到域名解析机构新增对应的解析
- 验证通过后,下载我们需要证书类型,包括nginx,apache,iis等
- 将证书部署到web站点
虽然流程也是比较简单,但还是需要手动修改一些东西,对应到实际的公司环境,很可能还涉及到一些非技术层面的沟通工作,导致证书的部署流程并没有我们想想的那般顺畅。
为了解决这个问题,或者说为了在一定程度上缓解这个问题,一般有以下几种做法
- 购买多年份付费证书
- 绑定某一大厂云平台,流水线式部署
- 利用acme协议,完成证书的自动续期
那三种方案也都有各自的优缺点,
第一种的缺点很明显,就是无法完全避免手动操作,只是拉长的间隔。优点就是可以根据实际需求,灵活的选择各种类型证书,dv(免费或者便宜),ov(贵),ev(特别贵,申请特别难)。
第二种的话,其实最接近零配置方案,缺点就是和大厂服务深度绑定,比如域名在阿里云申请,证书也要在阿里云买,服务器也要在阿里云。
第三种的缺点就是目前来说只支持dv证书,再有就是需要一点点开发成本,优点就是,如果不考虑更换证书类型,可以说是接近一劳永逸了。
有免费的dv证书为啥还要用收费的ov,ev类证书呢?
这一点有疑问的小伙伴可以搜一搜,事实上我认为dv证书就可以满足绝大多数场景了,即便是Google,Redis这类大厂的官网,用的证书,也是dv证书哦!但国内的好多站点,即便是小厂,有的也要上ov甚至ev证书,多少有点面子工程了~。
感兴趣的小伙伴,可以到这里查看你想查的网站用的那种证书:https://myssl.com/,我这里放一张redis官网的证书报告
1、域名
首先要准备一个自己可以操作,或者很方便让别人来替你操作的域名。最好是申请一个自己的,平时测试什么的可以直接拿来用,一年也用不了多少钱,我这自己的这个,每年十几块钱。
2、服务器
最好是有一台自己的专属云服务器,原因无他,也是为了方便,毕竟在自己的服务器上乱搞也不怕搞坏了,大不了重装系统。这个成本稍微高点,但目前各大平台对新用户还是很照顾的,基本都是 100 块钱以内 1 年,到期了不行就换平台呗,这么多平台呢,轮着薅
配置环境 本文以 debian 操作系统为例,演示通过部署 acme.sh 脚本来自动颁发并安装证书。这里我的证书颁发机构是 freessl,国内大平台
*安装 Nginx
这一步不是必须的,但我们的站点需要有一个 web 服务器,除了 nginx,也可以用 apace 等其他 web 服务,我这里以 nginx 为例。
apt-get update
apt-get install -y nginx
安装完成后,检测安装效果
安装 acme.sh
curl https://get.acme.sh | sh -s email=your@email.com
安装完成后,页面会有相应提示,如果系统没有安装 socat,控制台上会提示安装 socat,具体原因控制台上也有输出。
这里因为我的云服务器上已经安装过了,为了再次展示这个安装提示,我在本地的 subsystem 上又安装了一下,打印了这个输出。
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。所以我们最好从 letsencrypt 的直属证书颁发机构去申请证书,我这里使用的是 freessl(传送门:https://freessl.cn/)
这里也可以用其他平台,只要支持自动续期的服务就都可以,这里有个小伙伴用的阿里云的方案。
配置解析
登录完成后,进入【ACME 自动化】界面,添加域名,根据提示一步步完成操作,注意这里的配置 cname 解析需要到自己的域名服务商那里去配置;
安装脚本
dvc 验证通过后,freessl 会自动生成 acme.sh 的部署脚本,直接复制该脚本到目标服务器执行即可。
到这里,我们就可以拷贝这条命令,回到云服务器的控制台,部署安装了
注意,这里安装的时候,可能会出现一些 504 之类的错误(如下图👇),如果不是环境安装失败的话,一般就是网络问题,多试几次就可以了。
安装成功后,acme.sh 脚本可以设置成自动升级的模式
acme.sh --upgrade --auto-upgrade
配置 nginx
安装成功后,控制台会打印出证书文件的存放路径,然后就可以部署到 nginx 了
acme.sh --install-cert -d example.com \
--key-file /{控制台打印出来的实际路径} \
--fullchain-file /{控制台打印出来的实际路径} \
--reloadcmd "service nginx force-reload"
执行截图如下
这里注意,我们只是生成了适用于 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;
}
好了,至此,我们的配置工作就基本完成了,验证一下成果
至此,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