acme.sh免费申请letsencrypt证书升级https
为支持https访问,需要申请一个ssl证书使用。在网上查了一下发现了Let’s Encrypt,向该证书颁发机构申请证书免费,而且支持泛域名证书,只需要每3个月续期一次便可以。因为acme.sh为shell编码,不需要额外安装软件,使用比较方便所以选择使用该方式申请。本文将记录使用acme.sh申请证书及配置过程。
一、安装acme.sh
安装中会提示需要安装socat模块,可以使用yum直接安装:
yum -y install socat
接下来便可以安装acme.sh客户端了,官方提供了从网页安装的方法,可以使用如下命令:
curl https://get.acme.sh | sh -s email=my@example.com
或者
wget -O - https://get.acme.sh | sh -s email=my@example.com
安装过程一般很快,程序默认安装到当前用户的home目录下:
~/.acme.sh/
然后会自动创建一个 定时任务,每天 0点左右会自动检测所有的证书,如果快过期了, 则会自动更新。
可以使用以下命令查看:
crontab -l
安装完成后,程序会添加一个shell 的别名,例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
可以使用如下命令加载:
source ~/.bashrc
二、证书生成
acme.sh实现了acme协议支持的所有验证协议。一般有方式验证:http和dns验证。
1.http方式验证:
http方式需要在网站根目录下放一个文件,来验证域名所有权。然后就可以生成证书了。
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只需要指定域名和根目录,acme.sh自动生成验证文件,验证完成后自动删除验证文件。
如果使用nginx或者apache,可以不指定目录,acme.sh会自动验证:
acme.sh --issue -d mydomain.com --apache
acme.sh --issue -d mydomain.com --nginx
2.手动DNS方式验证:(此方式无法自动更新证书)
执行以下语句获取参数:
acme.sh --issue --dns -d eyyyye.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
按照程序提示,在域名解析中增加txt解析记录:
待解析完成后,执行以下命令生成证书:
acme.sh --renew --dns -d eyyyye.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
注意:注意第二次使用的参数是--renew
3.自动DNS API方式验证
自动dns需要域名管理服务商支持,需要登录到域名账号,生成api id 和 api key,以阿里云为例:
使用如下命令将获取的id放到系统环境变量中:
阿里云: export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
注意:此处有做适配的服务商可使用专用变量,具体参考:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
完成后使用以下命令生成证书:
阿里云:
acme.sh --issue --dns dns_ali -d example.com -d www.example.com
证书生成完成后保存在~/.acme.sh/example.com/
目录下,Ali_Keyand将Ali_Secret被保存~/.acme.sh/account.conf
下,并在需要时被重用。
腾讯云:
登录DNSPOD获取dnspod密钥:
https://console.dnspod.cn/account/token/apikey
腾讯云:
export DP_Id="123123"
export DP_Key="kjkdfkjslllksjJ"
./acme.sh --issue --dns dns_dp -d eyyyye.com -d *.eyyyye.com
三、安装证书
证书生成后在~/.acme.sh/example.com/
目录下,一般不直接使用,因为这里面的文件都是acme.sh内部使用的,而且目录结构可能会变化。
正确的使用方法是使用--install-cert
命令,并指定目标位置,然后将证书文件复制到相应位置,例如:
apache:
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/example.com.cer \
--key-file /path/to/keyfile/in/apache/example.com.key \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.cer\
--reloadcmd "service apache2 force-reload"
nginx:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/example.com.key \
--fullchain-file /path/to/fullchain/nginx/fullchain.cer \
--reloadcmd "systemctl restart nginx"
以上命令执行后,会将证书复制到指定目录中,当证书更新后,acme.sh会自动将新证书更新到该目录。
注意:这里用的是 systemctl restart nginx, 请确保你的nginx是通过systemctl工具管理的,可以使用systemctl status nginx 查看状态。
四、查看已安装证书
使用以下命令可以查看已经安装的证书信息:
acme.sh --info -d example.com
五、证书自动更新
官方描述,目前证书在 60 天以后会自动更新,只要定时任务正常则不用关心。
请确保 cronjob 正确安装, 看起来是类似这样的:
crontab -l
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
六、acme.sh 自动更新
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。
首先手动升级 acme.sh 到最新版 :
acme.sh --upgrade
然后设置自动更新:
acme.sh --upgrade --auto-upgrade
如果不想自动更新,可以设置关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
七、nginx配置参考
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /path/to/fullchain/nginx/fullchain.cer;
ssl_certificate_key /path/to/keyfile/in/nginx/example.com.key;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
八、其他问题
1.升级到https 后,访问网站发现部分资源不加载或提示不安全,查询原因为部分资源未升级到https。
后将网站的所有外链资源(CSS、JS、图片、音频、字体文件、异步接口、表单 action 地址等等)都升级为https,就可以正常访问了。
2.acme.sh使用遇到问题,可以使用以下命令debug log:
acme.sh --issue ..... --debug
扩展说明
1.https测试:https://www.ssllabs.com/ssltest/index.html
2.acme.sh地址:https://github.com/acmesh-official/acme.sh
3.Let’s Encrypt文档 :https://letsencrypt.org/zh-cn/docs/
- 本文标签: Linux Shell Netwoerk
- 本文链接: https://blog.eyyyye.com/article/34
- 版权声明: 本文由比特原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权