likes
comments
collection
share

快速且自动化的证书申请-acme.sh申请和管理证书

作者站长头像
站长
· 阅读数 7

如果是个人部署网站,那么现在有许多免费的证书供我们选择,例如Let's Encrypt、ZeroSSL等等。在前面我们介绍过如何使用Cerbot工具申请Let's Encrypt证书,不过Cerbot使用起来仍然是有一些复杂的。

除此之外,虽然阿里云也提供免费证书,但是现在阿里云免费证书申请一次只管3个月了,也非常不方便。

使用现在推荐一个更加强大且快速的证书申请脚本:acme.sh,它不仅内置多种免费证书,还支持自动化地申请和续期证书。

今天,我们就来学习一下如何使用这个脚本来完成证书申请,以及一些常用的证书管理命令。

acme.sh脚本的官网:传送门

1,安装acme.sh

连接到你的服务器,通过下列命令即可安装:

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

需要将上述youremail@example.com换成你自己的邮箱。

安装完成后记得先重新连接服务器或者重启终端,然后可以执行下列命令查看是否安装成功:

acme.sh -v

能够输出版本号信息则成功。

上述的安装命令事实上执行了下列步骤:

  • acme.sh脚本下载到你的home目录下的.acme.sh/目录中
  • 在你的.bashrc中创建了别名alias acme.sh=~/.acme.sh/acme.sh,使得我们可以使用acme.sh命令
  • 自动创建了系统定时任务cronjob,会在每天0点自动检测所有的证书,如果有证书快过期了则会自动更新证书

2,一键申请证书

下面我将介绍几种申请证书的方式,大家根据实际情况选择其一即可

(1) 在你的服务器上申请

如果你就在你的服务器上安装了acme.sh,并且已经将域名解析到了你的服务器,那么就可以直接在服务器上申请了!

执行下列命令:

acme.sh --issue -d example.com --standalone

将上述example.com替换成你自己的域名,需要注意下列几点:

  • 现在服务器上没有运行任何Web服务,即80端口空闲
  • 该域名已成功解析到当前服务器

稍等片刻,出现Success字样,并且输出了你的证书文件位置说明生成成功了:

快速且自动化的证书申请-acme.sh申请和管理证书

可见该方式非常的快捷,事实上acme.sh有很多申请证书的模式,上述我们使用的是Standalone模式,该模式下acme.sh假装自己是一个Web服务器,临时监听80端口完成验证。

如果申请证书过程中出现红色字报错:Please install socat tools first,则先执行下列命令安装socat工具:

sudo apt install socat

(2) 借助Cloudflare API申请证书

在之前我们申请证书都需要手动在域名解析商配置TXT DNS完成验证,事实上acme.sh还支持非常多域名解析商的API实现自动化证书申请。

今天以Cloudflare为例,实现用Cloudflare解析域名时,借助其API自动化完成证书申请,这里就不再赘述如何将域名解析权交给Cloudflare了。

首先登录你的Cloudflare账户,点击右上角我的个人资料:

快速且自动化的证书申请-acme.sh申请和管理证书

点击左侧栏API令牌,查看下面的Global API Key:

快速且自动化的证书申请-acme.sh申请和管理证书

输入密码后,复制下该API密钥备用:

快速且自动化的证书申请-acme.sh申请和管理证书

然后在服务器上,执行下列命令完成证书申请:

export CF_Email="你的Cloudflare账户邮箱"
export CF_Key="你的Cloudflare Global API Key"
acme.sh --issue --dns dns_cf -d example.com

可见只需设定CF_EmailCF_Key两个环境变量分别是你的Cloudflare邮箱和复制的Key,然后就可以申请了!上述example.com替换成你自己的域名。

3,拷贝证书文件

acme.sh会将证书生成在~/.acme.sh/你的域名_ecc/目录下,但是我们不能直接使用它们,需要借助--install-cert命令将其拷贝出来,例如:

acme.sh --install-cert -d example.com \
--cert-file "./cert/cert.pem" \
--key-file "./cert/key.pem" \
--fullchain-file "./cert/fullchain.pem"

上述-d后面仍然是接你的域名,然后后面几个参数意义如下:

  • --cert-file 指定复制你的证书文件到哪个位置
  • --key-file 指定复制你的证书密钥文件到哪个位置
  • --fullchain-file 指定复制你的全链证书文件到哪个位置

一般来说,以Nginx为例,我们只需配置证书文件证书密钥文件即可,因此--fullchain-file可以省略。

4,常用证书管理命令

(1) 查看已安装证书

首先可以通过下列命令列出全部证书:

acme.sh --list

可以看到所有证书信息,第一列就是我们证书域名:

快速且自动化的证书申请-acme.sh申请和管理证书

然后可以通过下列命令查看某个具体证书详细信息:

acme.sh --info -d example.com

(2) 续期证书

我们申请的证书通常有效期是3个月,而且acme.sh是可以自动续期我们所有证书的。

不过需要手动续期时,可以通过下列命令续期某个证书:

acme.sh -r -d example.com

也可以一键全部续期:

acme.sh --renew-all

(3) 吊销和移除证书

如果证书不需要了,我们可以将其吊销,需要注意的是:吊销不是删除证书就行了

首先通过下列命令吊销证书:

acme.sh --revoke -d example.com

出现Revoke success说明吊销成功。

不过现在证书文件还残留在服务器上,通过下列命令移除:

acme.sh --remove -d example.com

到此,就完成了证书吊销和移除操作。

(4) 更换默认CA

默认情况下acme.sh申请的是ZeroSSL的证书,如果你想切换为其它的CA厂商也是可以的,例如我们要切换成Let's Encrypt厂商:

acme.sh --set-default-ca --server letsencrypt

执行该命令后,后续就是申请的Let's Encrypt的证书了!

--server后接CA厂商名称,可用的名称如下:

  • letsencrypt
  • buypass
  • zerossl
  • sslcom
  • google
  • letsencrypt_test
  • buypass_test
  • googletest

test的通常是测试用的,仅推荐测试环境使用。

目前支持的CA厂商特性如下:

CA厂商证书有效期ECC证书域名数量支持通配符NotAfter国际化域名
Let's Encrypt90100
ZeroSSL90100
Google90100
Buypass1805付费
SSL.com902付费

可以根据自己需求设定和选择。

(5) 转换为p12证书

虽然acme.sh生成的证书可以直接配置到Nginx、Apache等等Web服务器使用,不过有少数时候如果说想直接配置证书到Tomcat中(Spring Boot)那就需要将证书转换成p12格式了!

生成证书后,将证书文件证书密钥文件复制出来,通过openssl命令转换:

openssl pkcs12 -export -in "证书文件路径" -inkey "证书密钥文件路径" -out "指定生成的p12证书文件路径"

执行命令会让你设定p12证书的密码,自行设定即可。

然后在Spring Boot配置文件配置如下:

# SSL证书设置
server.ssl.key-store=证书jks文件所在位置
server.ssl.key-store-password=证书密码
server.ssl.keyStoreType=PKCS12

server.ssl.key-store配置项需要以classpath:或者file:开头,一般classpath:开头的表示jar包内路径,Maven项目中src\main\resources文件夹即可对应为classpath的根目录,而file:对应的是jar包外相对路径或者绝对路径。

# classpath路径
server.ssl.key-store=classpath:ssl.p12

# jar包外路径
server.ssl.key-store=file:ssl/ssl.p12

5,参考文档

acme.sh有着丰富的文档,本文参考如下: