acme.sh 免费申请SSL证书
背景
最近在我的云服务器上部署了一个公司内部项目的测试环境,在访问S3存储的时候似乎需要HTTPS,所以研究一下怎么申请SSL证书。一番调研后决定使用acme.sh,部署服务后可以免费生成SSL证书并且可以自动续期,不用再手动替换证书。
安装acme.sh
官方文档参考:说明 · acmesh-official/acme.sh Wiki (github.com)
下面命令二选一,一个不行试试另一个,email替换成自己的邮箱
curl https://get.acme.sh | sh -s email=my@example.com
wget -O - https://get.acme.sh | sh -s email=my@example.com
如果想升级版本
acme.sh --upgrade
生成证书
生成证书有两种验证(验证这个域名是你的)方式,如果域名已经绑定了可以公网访问的服务器,使用HTTP验证比较方便。如果只是单纯有个域名想申请证书,使用DNS验证 (我验证下HTTP验证方式无法给泛域名生成证书,如果想给泛域名生成证书 "*.example.com" ,使用DNS验证)
一、HTTP验证
使用Nginx验证
这是我比较推荐的方式,一般Nginx大家都有,不过我之前都是用Docker装的Nginx,这里需要直接在Linux装Nginx才行。
这里顺便说一下Nginx安装吧:
# Ubuntu
sudo apt update
sudo apt install nginx
# CentOS
sudo yum install nginx # 对于较旧的系统
sudo dnf install nginx # 对于较新的系统
nginx -v # 查看nginx版本
sudo systemctl start nginx # 启动nginx服务
## nginx相关文件夹位于 /etc/nginx,可在此修改配置
使用nginx生成证书(域名替换成自己的)
sh /root/.acme.sh/acme.sh --issue -d mydomain.com --nginx
使用Apache验证
sh /root/.acme.sh/acme.sh --issue -d mydomain.com --apache
网站根目录验证
需要指定域名, 并指定域名所在的网站根目录 (不太明白这里的根目录,没有试验成功)
sh /root/.acme.sh/acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
二、DNS验证
登录DNSPod API 密钥 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS
我正好买的腾讯云的域名,创建一个腾讯云API秘钥(其他服务商的域名没操作过,可以参考: 将阿里云域名解析转入 DNSPod - DNSPod 服务与支持)
将上面创建的秘钥填入命令(域名替换成自己的)
export Tencent_SecretId="123"
export Tencent_SecretKey="123"
sh /root/.acme.sh/acme.sh --issue --dns dns_tencent -d example.com -d *.example.com # 可以指定多个子域名,也可以配置泛域名
执行成功后如下图
安装证书
证书生成后,需要配置到Apache或Nginx中,才可以正常使用HTTPS
官方不推荐直接使用 ~/.acme.sh文件夹下生成的证书文件,我们需要执行下列命令将证书文件copy出来
/path_to
替换成自定义的路径,注意替换域名
## Apache
sh /root/.acme.sh/acme.sh --install-cert -d example.com \
--cert-file /path_to/cert.pem \
--key-file /path_to/key.pem \
--fullchain-file /path_to/fullchain.pem \
--reloadcmd "service apache2 force-reload"
## Nginx
sh /root/.acme.sh/acme.sh --install-cert -d example.com \
--key-file /path_to/key.pem \
--fullchain-file /path_to/cert.pem \
--reloadcmd "service nginx force-reload"
修改Nginx配置
/etc/nginx/nginx.conf
将下图两处改为上面自定义的文件位置
systemctl restart nginx
重启Nginx即可使用HTTPS访问,目前证书是60天更新一次,不过更新是自动的,不需要再人工操作。
Apache配置请自行探索