原创

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/

正文到此结束
温馨提示:
本文最后更新于 2024年05月01日,已超过 42 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
本文目录