如果是个人部署网站,那么现在有许多免费的证书供我们选择,例如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_Email
和CF_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 | 是 | 是 | 是 |
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
有着丰富的文档,本文参考如下: