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

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

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

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

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

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

1,安装acme.sh

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

bash 复制代码
curl https://get.acme.sh | sh -s email=youremail@example.com

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

安装完成后,可以执行下列命令查看是否安装成功:

bash 复制代码
acme.sh -v

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

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

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

2,一键申请证书

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

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

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

执行下列命令:

bash 复制代码
acme.sh --issue -d example.com --standalone

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

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

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

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

(2) 借助Cloudflare API申请证书

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

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

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

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

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

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

bash 复制代码
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命令将其拷贝出来,例如:

bash 复制代码
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) 查看已安装证书

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

bash 复制代码
acme.sh --list

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

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

bash 复制代码
acme.sh --info -d example.com

(2) 续期证书

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

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

bash 复制代码
acme.sh -r -d example.com

也可以一键全部续期:

bash 复制代码
acme.sh --renew-all

(3) 吊销和移除证书

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

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

bash 复制代码
acme.sh --revoke -d example.com

出现Revoke success说明吊销成功。

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

bash 复制代码
acme.sh --remove -d example.com

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

(4) 更换默认CA

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

bash 复制代码
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 Encrypt 90 100
ZeroSSL 90 100
Google 90 100
Buypass 180 5 付费
SSL.com 90 2 付费

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

(5) 转换为p12证书

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

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

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

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

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

properties 复制代码
# 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包外相对路径或者绝对路径。

properties 复制代码
# classpath路径
server.ssl.key-store=classpath:ssl.p12

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

5,参考文档

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

相关推荐
。puppy2 分钟前
HCIP--3实验- 链路聚合,VLAN间通讯,Super VLAN,MSTP,VRRPip配置,OSPF(静态路由,环回,缺省,空接口),NAT
运维·服务器
颇有几分姿色11 分钟前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
AndyFrank42 分钟前
mac crontab 不能使用问题简记
linux·运维·macos
筱源源1 小时前
Kafka-linux环境部署
linux·kafka
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
算法与编程之美2 小时前
文件的写入与读取
linux·运维·服务器
xianwu5432 小时前
反向代理模块
linux·开发语言·网络·git
Amelio_Ming2 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
Ven%3 小时前
centos查看硬盘资源使用情况命令大全
linux·运维·centos
JaneJiazhao3 小时前
HTTPSOK:SSL/TLS证书自动续期工具
服务器·网络协议·ssl