想使用免费的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 安装
- 执行远程脚本
curl https://get.acme.sh | sh -s email=我的邮箱地址
这一步之后,会在当前用户的home目录下初始化相关文件。如果是root用户,那么其位于为/root
目录下。
直接使用ls
命令将无法查看,因为下载的文件是以点.开头,而在linux上这种格式的文件是属于隐藏文件。因此应以ls -al
命令进行查看
- 给路径下的可执行文件指定一个方便使用的别名。
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
二、单域名证书生成
- 生成证书。
由于我已经安装了nginx反向代理,ssl服务也是通过nginx提供,因此我这里选择的验证方式为本地nginx
acme.sh --issue -d 我的域名 --nginx
- 修改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认证方式
- 先执行命令
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";
五、通过内网穿透进行证书生成
需要有公网服务器,因为域名提供商要进行地址校验。