前言
最近接手了个小程序项目,但是由于交接文档不完善,于昨天上午域名证书过期,导致无法调用后端服务,短暂(五分钟左右)影响了小程序的使用,也算是一个不大不小的事故吧[手动捂脸笑...]
解决过程
临时处理
发现是证书过期导致的问题,立马就上阿里云申请新的证书,五分钟左右,证书就签发下来了,还是挺快的,替换证书之后,服务恢复正常,但是免费的证书只有3个月的有效期,之前是1年,到期之后需要再次申请并手动替换证书,比较麻烦,于是就在想有没有更好的自动化的方法,经过一番摸索,发现是有方法的。
最终解决
替换 let's Encrypt
的证书,并配置自动更新
-
之前的文章 https证书自动续期 介绍了如何使用
let's Encrypt
申请并且配置自动更新证书,也可以访问其 官网 了解其他用法,不清楚的朋友可以看看; -
自动更新的原理大概是:证书默认3个月有效期,每天检查证书是否过期,在离过期时间前一个月,自动申请新的证书并替换;
-
以
example.com
为例Let's Encrypt
签发下来的各个文件作用:文件名 作用 ca.cer 中间证书 fullchain.cer 证书链 example.com.cer 证书文件 example.com.conf acme.sh
工具自动安装证书配置文件example.com.csr 证书签名请求(Certificate signing request),包含证书持有人的信息,如:国家,邮件,域名等信息 example.com.csr.conf 证书签名请求配置 example.com.key 单独存放的 cer 格式的密钥,一般保存为 *.key配置nginx
配置nginx
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/nginx/ssl/lets-encrypt/example.com_ecc/fullchain.cer; #这里的ssl是自定义文件夹
ssl_certificate_key /etc/nginx/ssl/lets-encrypt/example.com_ecc/example.com.key; #这里的ssl是自定义文件夹
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# root /var/www/html;
root /home/hy/www/html/wechat-mini-program;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
-
ssl_certificate
服务器证书的文件路径注意注意,这里很重要!很重要!很重要!重要的事情说三遍:
ssl_certificate
这里配置的证书是fullchain.cer
,而不是example.com.cer
,example.com.cer
浏览器是能正常的,但是微信小程序端不认这个证书,因为证书链不完整而不受信任,必须是使用fullchain.cer
-
ssl_certificate_key
服务器证书对应的私钥文件 -
ssl_session_cache shared:SSL:1m;
配置SSL会话缓存的类型和大小这里使用的是共享内存区域(shared)来存储SSL会话参数,每个会话大约占用1MB的空间。会话缓存可以加速后续的SSL握手过程,因为复用之前的会话参数可以减少计算量。
-
ssl_session_timeout 10m
设置SSL会话的超时时间这里配置为10分钟。如果一个SSL会话在10分钟内没有任何活动,服务器将销毁这个会话,用户将需要重新进行SSL握手来建立新的会话。
-
ssl_ciphers HIGH:!aNULL:!MD5
指定服务器允许的加密算法(密码套件)- 这里配置表示使用高强度的加密算法,排除不支持认证的算法(aNULL)和MD5哈希算法,因为它们被认为是不安全的。
-
ssl_prefer_server_ciphers on
这个指令告诉Nginx服务器在SSL握手时优先使用服务器端支持的加密算法,而不是客户端优先。这可以确保使用更安全的加密算法,因为服务器通常配置为使用更强的加密设置。
结语
配置完 let's encrypt
和 nginx
后,重启 nginx
服务就能正常使用了,而且不用再关注证书是否过期了,只要 let's encrypt
服务不出问题,可以永久使用,亲测有效,最重要的是:ssl_certificate
这里配置的证书是 fullchain.cer
,再次提醒,希望这篇文章能帮助遇到相同问题的朋友。