前言
对于网站而言,SSL加密非常重要,不仅可以加强网站的安全性,而且还能提高网站的SEO,浏览器不会提示用户站点是非安全的。
acme.sh 实现了 acme
协议, 可以从 letsencrypt 生成免费的证书.
GitHub项目地址:
一、通过 Certbot 自动更新证书
1、CentOS 8 安装 SNAP
复制 dnf -y install epel-release
dnf upgrade
dnf -y install snapd
systemctl enable --now snapd
2、CentOS 7 安装 SNAP
2.1 通过添加epel
存储库并安装copr yum
插件开始安装。
复制 yum -y install epel-release yum-plugin-copr
2.2 添加仓库
复制 yum copr enable ngompa/snapcore-el7
2.3 添加存储库后,安装snapcore
包。
2.4 安装完成,启用snapd socket
复制 systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
2.5 查询帮助页面
3、更新 SNAP 到最新版本
复制 snap install core
snap refresh core
ln -s /var/lib/snapd/snap /snap
4、使用 SNAP 安装 Certbot
复制 snap install --classic certbot
5、建立 Certbot 的软连接
复制 ln -s /snap/bin/certbot /usr/bin/certbot
6、使用 Certbot获取SSL证书,可以指定 –apache 或者 –nginx, 这两个是最常用的选项,这里使用 Nginx。
创建过程中会询问一些基础的问题,比如说 email、域名等。
7、使用 Certbot 进行自动更新
复制 certbot renew --dry-run
二、通过 acme.sh 自动更新证书
1、CentOS 终端下执行:
复制 dnf -y install socat
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m myemail@example.com
案例
复制 git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install \
--home ~/myacme \
--config-home ~/myacme/data \
--cert-home ~/mycerts \
--accountemail "my@example.com" \
--accountkey ~/myaccount.key \
--accountconf ~/myaccount.conf \
--useragent "this is my client."
说明:
--home
是一个自定义的安装目录acme.sh
。默认情况下,它安装到~/.acme.sh
-m
,--email 指定账户邮箱,只对'--install
'和'--update-account
'命令有效。
--config-home
是一个可写文件夹,acme.sh 将在那里写入所有文件(包括证书/密钥、配置),默认情况下,它在--home
--cert-home
是一个自定义目录,用于保存您颁发的证书,默认情况下,它保存在--config-home
.
--accountemail
是用于注册 Let's Encrypt 帐户的电子邮件,您将在此处收到续订通知电子邮件。
--accountkey
是保存您帐户私钥的文件。默认情况下,它保存在--config-home
.
--user-agent
是用于发送到 Let's Encrypt 的用户代理标头值。
2、安装完成后,可输入acme.sh -v
查看当前版本。
复制 [root@VM-0-4-centos ~]# acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.0
acme.sh
3.x版本默认使用Let’s Encrypt作为服务提供商,我们可以通过以下命令,将其更换为ZeroSSL:
复制 acme.sh --set-default-ca --server zerossl
3、输入 acme.sh --help
即可查看 acme.sh 的帮助命令
三、申请证书
1、通过 HTTP 方式申请证书
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会删除验证文件. 整个过程没有任何副作用.
复制 # 生成 RSA 证书:
acme.sh --issue -d zhiqiang.cloud -w /etc/nginx/conf.d/ssl/
# 生成 ECC 证书:
acme.sh --issue -d zhiqiang.cloud -w /etc/nginx/conf.d/ssl/ --keylength ec-256
/etc/nginx/conf.d/ssl/
为 zhiqiang.cloud
站点下的证书请求目录。
如果没有安装 web 服务器,acme.sh 也自带一个建议的web服务用于证书申请,前提是需要安装 socat ,80端口没有被占用。使用方法:acme.sh --issue -d zhiqiang,cloud --standalone
2、通过 DNS 方式申请证书
优点: 不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证,而且可申请泛域名证书。
缺点: 需要配合DNS解析服务商的API使用,否则 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
SSL证书验证可通过DNS验证、文件验证等多种方式,为了方便多个域名申请以及后续证书更新,推荐使用DNS API方式,不过在使用前需要先进行设置。
阿里云 DNS 申请方式
1、打开 https://usercenter.console.aliyun.com/#/manage/ak ,获取 AccessKey ID
和 AccessKey Secret
2、配置环境变量
复制 [root@hezhiqiang ~]# export Ali_Key=---------(换成你自己的AccessKey ID)
[root@hezhiqiang ~]# export Ali_Secret=-------(换成你自己的AccessKey Secret)
3、申请证书
复制 # RSA 证书
acme.sh --issue --dns dns_ali -d zhiqiang.cloud -d *.zhiqiang.cloud
# ECC 证书
acme.sh --issue --dns dns_ali -d zhiqiang,cloud -d *.zhiqiang.cloud --keylength ec-256
申请证书后, key 和 秘钥会被 明文 保存在 ~/.acme.sh/account.conf
, 请妥善保管
如果需要重新申请证书: 请删除掉该目录下内容 rm -rf /root/.acme.sh/zhiqiang.cloud/*
腾讯云 DNSPod 申请方式
1、Token可通过:https://console.dnspod.cn/account/token/token# 获取。
复制 export DP_Id="123456"
export DP_Key="abcdefxjhajk"
acme.sh --issue --dns dns_dp -d zhiqiang.cloud -d www.zhiqiang.cloud
华为云 DNS 申请方式
复制 export HUAWEICLOUD_Username=<Your Username> # Usually hwxxxxxx
export HUAWEICLOUD_Password=<Your Password>
export HUAWEICLOUD_ProjectID=<A Project ID>
HUAWEICLOUD_Username:华为云用户名
HUAWEICLOUD_Password:华为云密码
HUAWEICLOUD_ProjectID:可通过我的凭据 获取
目前支持 DNSPod、CloudXNS、Aliyun、jdcloud、 CloudFlare、 GoDaddy、 Azure、AWS 等国内外大多数主流DNS服务提供商。
查看更多DNS API 使用方式, 请查看 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
四、ZeroSSL使用说明
注意: 通过ZeroSSL官网在线申请SSL证书,免费账户是有3个域的额度限制的,但通过acme.sh
申请则没有这个限制,所以建议使用acme.sh
进行申请,简单方便。
1、申请ZeroSSL泛域名SSL证书
首次使用需要先注册ZeroSSL账户(参考上一步),如果已经注册,下面的命令会自动关联账户,命令如下(myemail@example.com
改成你自己的ZeroSSL邮箱,不要乱填 ):
复制 acme.sh --register-account -m myemail@example.com --server zerossl
以zhiqiang.cloud
域名为例,该域名使用DNSPod解析,我已经在上一个步骤中设置好DNSPod解析DNS API,现在可以输入命令直接申请:
复制 acme.sh --dns dns_dp --issue -d zhiqiang.cloud -d *.zhiqiang.cloud
2、多域名证书
acme.sh 可以同时申请多个域名.例如拥有域名aaa.com
,bbb.com
,ccc.com
,只需要在命令后加上-d 空格 域名
即可
例如:
复制 acme.sh --issue --server letsencrypt --dns dns_dp -d aaa.com -d *.aaa.com -d bbb.com -d *.bbb.com -d ccc.com -d *.ccc.com
多域名申请证书会将多个证书合并为一个证书,并存放到以第一个域名命名的文件夹内,证书信息仅显示第一个域名的信息.
五、自动部署
如果申请过程中没有报错,就可以将SSL证书拷贝到任何想要的位置进行使用,命令如下:
复制 acme.sh --installcert -d zhiqiang.cloud \
--key-file /data/ssl/zhiqiang.cloud.key \
--fullchain-file /data/ssl/zhiqiang.cloud.crt
上述命令将zhiqiang.cloud
SSL证书导出到了/data/ssl
目录,前提是需要创建相关目录。
六、手动拷贝证书
1、查询域名生成的证书路径.
复制 ~]# tree /root/.acme.sh/zhiqiang.cloud
/root/.acme.sh/zhiqiang.cloud
├── ca.cer
├── fullchain.cer
├── zhiqiang.cloud.cer
├── zhiqiang.cloud.conf
├── zhiqiang.cloud.csr
├── zhiqiang.cloud.csr.conf
└── zhiqiang.cloud.key
0 directories, 7 files
2、拷贝到 Nginx 目录.
仅供参考,请根据具体的域名进行替换
复制 ]# mkdir -p /etc/nginx/conf.d/ssl/zhiqiang.cloud
]# cp ~/.acme.sh/zhiqiang.cloud/* /etc/nginx/conf.d/ssl/zhiqiang.cloud
]# tree /etc/nginx/conf.d/ssl
/etc/nginx/conf.d/ssl
└── zhiqiang.cloud
├── ca.cer
├── fullchain.cer
├── zhiqiang.cloud.cer
├── zhiqiang.cloud.conf
├── zhiqiang.cloud.csr
├── zhiqiang.cloud.csr.conf
└── zhiqiang.cloud.key
1 directory, 7 files
七、配置证书.
以 CentOS 环境为例, 其他环境未测试,但是应该比较类似.
1、新建Nginx配置文件
复制 vim /etc/nginx/conf.d/zhiqiang.cloud.conf
2、写入以下内容
复制 server {
listen 80; # 代理端口, 通过此端口重定向到443访问, 不再通过8080端口
server_name www.zhiqiang.cloud; # 修改成你的域名或者注释掉,多个域名,以空格分开
client_max_body_size 100m; # 文件上传大小限制
return 301 https://www.zhiqiang.cloud/; # 将 http 重定向 https
listen 443 ssl; # 服务器开启443端口
server_name www.zhiqiang.cloud; # 修改成你的域名或者注释掉,多个域名,以空格分开
ssl_certificate /etc/nginx/conf.d/ssl/zhiqiang.cloud/zhiqiang.cloud.cer; # crt文件的路径
ssl_certificate_key /etc/nginx/conf.d/ssl/zhiqiang.cloud/zhiqiang.cloud.key; # key文件的路径
ssl_session_timeout 5m; # 缓存有效期
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 安全链接可选的加密协议
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 加密算法
ssl_prefer_server_ciphers on; # 使用服务器端的首选算法
client_max_body_size 100m; # 文件上传大小限制
}
3、检测Nginx语法
复制 [root@VM-0-4-centos ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
4、启动Nginx进行验证
复制 systemctl restart nginx
八、验证证书配置成功.
打开浏览器 https://zhiqiang.cloud/ 验证 HTTPS 证书
九、自动更新证书
ZeroSSL 的证书有效期为60天
目前手动添加DNS获取证书的方式无法自动更新,但是使用DNS API的方式进行获取证书可以在 60 天以后会自动更新, 你无需任何操作.
1、强制执行更新任务
2、编写自动配置脚本 vim ~/.acme.sh/auto-udate-ca.sh
复制 /root/.acme.sh/acme.sh --dns dns_dp --issue -d zhiqiang.cloud -d *.zhiqiang.cloud
cp ~/.acme.sh/zhiqiang.cloud/* /etc/nginx/conf.d/ssl/zhiqiang.cloud
systemctl restart nginx
复制 [root@VM-0-4-centos ~]# chmod +x /root/.acme.sh/auto-udate-ca.sh
3、配置每3个月更新一次 vim /etc/crontab
复制 * * * */3 * root /root/.acme.sh/auto-udate-ca.sh > /dev/null
十、acme升级
目前由于 acme 协议和 Let`s CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
升级 acme.sh 到最新版 :
如果你不想手动升级, 可以开启自动升级:
复制 acme.sh --upgrade --auto-upgrade
之后, acme.sh 就会自动保持更新了.
你也可以随时关闭自动更新:
复制 acme.sh --upgrade --auto-upgrade 0
十一、故障排查
错误一:
解决方案:
查询libssl.so
模块版本
复制 ldconfig -v | grep libssl.so
1. 新增 repo 源
复制 vim /etc/yum.repos.d/city-fan.repo
内容为:
复制 [cityfan]
name=cityfan
baseurl=http://www.city-fan.org/ftp/contrib/yum-repo/rhel8/x86_64/
enabled=1
gpgcheck=0
2. 更新 curl
复制 dnf -y update curl libcurl
其它出错, 请添加 debug log
:
复制 acme.sh --issue ..... --debug
或者:
复制 acme.sh --issue ..... --debug 2
请参考:
本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.