目录:
环境说明:
Linux:ubuntu 20.0.4
nginx:1.18
域名服务商:阿里云
安装之前
关于如何给 Nginx 服务器安装 SSL 证书,在之前的博客 为Nginx服务器安装SSL证书实现站点的HTTPS访问 - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) 这一篇中写过,里面详细介绍了申请到安装的一系列流程,只不过,上一篇是以申请阿里云的免费单域名证书为例来介绍SSL证书的安装,而本篇则主要来详细介绍一下泛域名证书(也叫通配符证书)的申请。
如果你不明白单域名证书与泛域名证书的区别,那么可以看看这篇:通配符ssl证书与单域名、多域名版的区别,通配符证书有哪些品牌呢?。
简单来说,单域名证书只适用于单个三级域名,而泛域名证书适用于二级域名以及二级域名下所有带前缀的的三级域名。
阿里云、腾讯云等平台的单域名证书很容易就能免费申请到,但是泛域名证书普遍都是收费的。对于个人来说,如果需要使用泛域名证书,也有免费的渠道可以申请到,那就是 Let's encrypt 签发的泛域名证书。
可以用来申请 Let's encrypt 证书的工具太多了,官网文档上列出来的就有几十种,本篇博客使用 acme.sh
脚本来申请 Let's encrypt 证书。
1.安装acme.sh脚本
这是其 Github 项目链接:https://github.com/acmesh-official/acme.sh
官方文档中安装脚本有这么几种方法:
-
从https://get.acme.sh上安装:
curl https://get.acme.sh | sh 或者: wget -O - https://get.acme.sh | sh
-
从github安装:
curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh
-
从github上克隆整个项目:
# 这一步要用到git,安装过的可以忽略,没有安装的用以下命令安装git: sudo apt install git # 克隆项目目录 git clone https://github.com/acmesh-official/acme.sh.git # 进入克隆完成的目录 cd acme.sh # 给脚本文件执行权限 chmod a+x acme.sh # 运行脚本文件,这个邮箱用来接收证书续订的通知,不可省略 ./acme.sh --install --accountemail [邮箱]
1.执行脚本时,如果碰到报错:
/usr/bin/env: ‘sh\r’: No such file or directory
可尝试这个方法:Linux系统下运行bash脚本提示/usr/bin/env: ‘bash\r’: No such file or directory - Cqlismy - 博客园 (cnblogs.com)
2.关于安装时acme.sh的一些高级选项及其用法:
--home
:自定义安装acme.sh
的目录. 默认情况下安装在~/.acme.sh
。--config-home
:设置一个目录来保存证书、密钥、配置等文件,默认情况下,保存在--home
。--cert-home
:保存证书的目录,默认情况下,保存在--config-home
。--accountemail
:用来注册 Let's Encrypt 账户的邮箱,通过这个邮箱来接收证书续订通知的邮件。--accountkey
:保存帐户私钥的文件,默认情况下,保存在--config-home
。--user-agent
:访问 Let's Encrypt 服务器时的浏览器标识。
3.脚本在安装的过程中,做了3件事:
- 复制
acme.sh
到 HOME 目录($HOME):~/.acme.sh/
之后所有生成的证书也会放在这里 - 创建别名:
acme.sh=~/.acme.sh/acme.sh
- 创建 cron 每日任务去检查是否有证书需要更新
如:0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
我在安装的时候,前两种方法都不成功,只有第三种方法管用。所以根据自身情况选择一种方法安装即可,但是用第三种方法的时候要记得克隆完项目之后执行脚本。
如果安装完成之后,使用 acme.sh
命令时提示找不到命令,则需要重新加载一下环境变量:
source ~/.bashrc
接下来,我们需要来验证我们对这个域名的所有权,因为很容易就能想到,SSL 证书签发机构肯定不能随意签发证书。
通常的验证方式有两种:
- 文件验证:需要在网站根目录下放置一个文件,来验证域名所有权
- DNS验证:给域名添加一条 TXT 解析记录,也可以用来验证域名所有权
建议使用 DNS 验证,这种方式的好处是,不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可,并且如果有域名服务商的DNS api ,甚至都不需要我们手动添加 TXT 解析记录,脚本会自动完成添加解析记录的过程,验证完成之后还会聪明地删掉解析记录。
2.获取域名服务商的DNS api
因为博主只有阿里云域名,没有其他服务商那里的域名,这里以阿里云为例来说明如何获取 api。
进入 阿里云AccessKey管理界面 并登录,点击左上角创建 AccessKey,就会弹出一个页面,上面是创建出来的 AccessKey,将其复制下来。
关于 api 的使用方法,官方文档 How to use DNS API 说明的很详细,可以自己查阅,根据自己的域名商选择对应的就行。阿里云对应的是文档中第 11 个,那么按照文档中的方法,在命令行中输入:
# 设置环境变量,对应的等号后面换成自己的key和secret,双引号别丢了
export Ali_Key="key"
export Ali_Secret="secret"
3.生成证书
下面这一步就很简单了,根据官网文档 dnsapi · acmesh-official/acme.sh Wiki (github.com),一句命令就能签发证书:
acme.sh --issue --dns dns_ali -d *.langp.wang -d langp.wang
上面这句命令适用于阿里云平台的域名,其中的 langp.wang
改为需要签发证书的域名即可,后面的 -d *.langp.wang
参数表示生成适用于所有三级域名的泛域名证书,当然也可以改成 -d langp.wang
来生成单域名证书,或者两个参数都加上也可以。
证书如果签发成功,会有“success”字样提示,末尾处会输出生成的证书文件的位置与名称:
根据官方文档,对应的秘钥文件是xxx.key
,证书文件是fullchain.cer
,接下来就可以安装证书了。Nginx 服务器安装 SSL 证书的方法可以参考我的另一篇博客:为Nginx服务器安装SSL证书实现站点的HTTPS访问 - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)。
4.续签证书
签发好的泛域名证书是三个月的期限,过期了需要重新签发,才能继续使用:
acme.sh --renew -d *.langp.wang -d langp.wang --force
同样的,将命令中的 langp.wang
改为续签证书的域名即可。
5.问题及注意事项
5.1.安装脚本时提示加载 api 脚本失败
脚本文件在上传到服务器之前在 windows 本地被打开过了,其格式被改变,在 Linux 系统中执行时便出现报错。
可尝试这个方法:Linux系统下运行bash脚本提示/usr/bin/env: ‘bash\r’: No such file or directory - Cqlismy - 博客园 (cnblogs.com),或者重新下载一次脚本文件。
5.2.添加 TXT 解析记录失败
大概率是 DNS api 的问题。可尝试换一个 api,然后修改 .acme 文件夹下的 acme.conf 文件中的 api。
5.3.申请证书时卡在验证步骤
解决办法:
申请之前执行这条命令:
export ACME_USER_WGET=1
上个办法如果无效,那么可能是由于申请失败的次数太频繁,被加入了黑名单,等待一两天之后再申请
5.4.注意事项
-
Nginx 的配置
ssl_certificate
使用生成的fullchain.cer
,而非<domain>.cer
,否则会报Chain issues Incomplete
错误 -
证书续签时,直接在原来的脚本文件目录上执行签发命令,可以不用执行设置 api 的命令。前提是 api 依然有效
-
更新完本地证书之后,需要重载 Nginx 配置文件:
nginx -s reload # 或者 nginx -s force-reload
-
服务器的证书更新之后,CDN 服务也需要更新证书
评论