使用acme.sh配置https证书,并在微信小程序中使用

想使用免费的https证书怎么办?想自动给证书续期怎么办?

Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行。 它是一项由 Internet Security Research Group (ISRG) 提供的服务。
以尽可能对用户友好的方式免费提供为网站启用 HTTPS(SSL/TLS)所需的数字证书

官网上列出有很多可支持生成证书及维护的客户端工具
https://letsencrypt.org/zh-cn/docs/client-options/
这里选择acem.sh,使用很简单

0、证书链问题

最重要的问题,所以先说
按一般的教程配置后,浏览器都通过了,但是微信小程序无法使用访问,这是因为微信要求证书链完整,必须引用那个fullchain.cer才可以。

一定要注意,引用的cer文件不能是域名位名称那个cer文件,否则微信小程序不认,必须配置为fullchain.cer才可以。
这个问题坑了我太久了。

文末附证书评级检测方法。

一、acme.sh 安装

  1. 执行远程脚本
curl https://get.acme.sh | sh -s email=我的邮箱地址

这一步之后,会在当前用户的home目录下初始化相关文件。如果是root用户,那么其位于为/root目录下。
直接使用ls命令将无法查看,因为下载的文件是以点.开头,而在linux上这种格式的文件是属于隐藏文件。因此应以ls -al命令进行查看

  1. 给路径下的可执行文件指定一个方便使用的别名。
alias acme.sh=/root/.acme.sh/acme.sh

执行后,可在其它目录下使用acme.sh

问题:上面脚本的执行会从境外服务器下载文件,很多时候可能会超时而下载失败。
如果你的安装服务器位于中国大陆境内, 访问 github 可能会不成功.
所以安装可能会失败.
推荐从这里下载安装:
https://gitee.com/neilpang/acme.sh
安装步骤:
根据 How-to-install#3-or-git-clone-and-install
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com

二、单域名证书生成

  1. 生成证书。
    由于我已经安装了nginx反向代理,ssl服务也是通过nginx提供,因此我这里选择的验证方式为本地nginx
acme.sh --issue -d 我的域名 --nginx
  1. 修改nginx中cert路径指向这里

! 下面一定要注意,引用的cer文件不能是域名位名称那个cer文件,否则微信小程序不认,必须配置为fullchain.cer才可以。

server {
    listen 443 ssl;
    
    server_name 目标域名;
    
    ssl_verify_client      off;
    ssl_certificate /root/.acme.sh/我的域名/fullchain.cer;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。
    ssl_certificate_key /root/.acme.sh/我的域名/我的域名.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;

    	……其它配置项

}

有些情况下,可能这种方式

Pending, The CA is processing your order, please just wait. (1/30)
[Fri Jan 26 10:22:14 CST 2024] Pending, The CA is processing your order, please just wait. (2/30)
[Fri Jan 26 10:22:18 CST 2024] Pending, The CA is processing your order, please just wait. (3/30)
[Fri Jan 26 10:22:22 CST 2024] Invalid status,xxxx.com:Verify error detail:139.198.108.126: Fetching http://xxxxx/.well-known/acme-challenge/0koFSrvUu0diIpOujYG1OfUQ3x3WCF3PS5Ec: Timeout during connect (likely firewall problem)
[Fri Jan 26 10:22:22 CST 2024] Restoring from /root/.acme.sh/xxxxx.com_ecc/backup/xxxxx.com.nginx.conf to /etc/nginx/conf.d/zhilian.conf
[Fri Jan 26 10:22:22 CST 2024] Reload nginx
[Fri Jan 26 10:22:23 CST 2024] Please check log file for more details: /root/.acme.sh/acme.sh.log

这样的话,就在nginx中增加配置webroot,以下如果用root属性,那么需要在对应路径下提前创建好目录/.well-known/acme-challenge/

location /.well-known/acme-challenge/ {
   root /var/opt/z/iiot/index-web/;
}

然后使用命令

acme.sh --issue -d xxxxxx.com --nginx --force --webroot /var/opt/z/iiot/index-web/

再不行,就可能是证书提供商需要切换指定,这里指定使用zeroSSL生成。(注意zeroSSL和lets encrypt生成的证书路径是不同的)

acme.sh --server zerossl  --issue -d xxxx.com --nginx --force --webroot /var/opt/z/iiot/index-web/

三、泛解析域名生成

需要使用dns认证方式

  1. 先执行命令
acme.sh --issue --dns -d *.demo.我的域名 \
 --yes-I-know-dns-manual-mode-enough-go-ahead-please

执行后在输出信息中将包含

[Sun Jan 29 06:30:19 PM CST 2023] Add the following TXT record:
[Sun Jan 29 06:30:19 PM CST 2023] Domain: '_acme-challenge.demo.我的域名'
[Sun Jan 29 06:30:19 PM CST 2023] TXT value: 'HJiuhaoFfJehACWOQEiMc6z7DsSEtp0HynIg'

按照提示信息,在域名解析中添加一条txt记录,域名和值分别为上面所输出的内容中提示的填写。
如图:
在这里插入图片描述
域名解析配置完成后,再次执行

acme.sh --renew -d *.demo.我的域名 \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please

四、补充

查看定时任务

在第一步执行远程脚本后,会自动生成定时任务检查证书并自动更新,不必再自己每年手动替换生成证书。
可使用指令查看本机已开启的定时任务

[root@i-ltysspwz ~]# crontab -l
14 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
  • crontab -l 表示列出所有的定时任务
  • crontab -r 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:“no crontab for admin”

301重定向

可在nginx中配置将80端口的访问301重定向到https的地址上。

server {
    server_name a.demo.我的域名;
    listen 80;
    ssl_certificate /root/.acme.sh/*.demo.我的域名/*.demo.我的域名.cer;
    ssl_certificate_key /root/.acme.sh/*.demo.我的域名/*.demo.我的域名.key;
    return 301 https://u.demo.我的域名$request_uri;
}

证书链问题补充

可以在https://myssl.com/ 查看自身域名的评级,如果引用的是域名位名称的cer文件,那一般评级会是B,下面会给出降级原因主要为证书链不完整。
在这里插入图片描述

使用fullchain.cer后,再次检测刷新报告,证书将成为A
在这里插入图片描述

再进一步按提示在nginx中增加配置,即可将评级提升为A+

ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000";

在这里插入图片描述

五、通过内网穿透进行证书生成

需要有公网服务器,因为域名提供商要进行地址校验。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值