支付宝沙箱页面证书过期并提示NET::ERR_CERT_DATE_INVALID
结论
证书的“到期日期”和当前日期都是 Jun 4, 2025,不等于证书在当天 24 小时内始终有效。TLS 证书记录的 notAfter 精确到秒,通常使用 UTC;浏览器界面可能只显示日期,不显示具体时间和时区。
这意味着证书可能已在 2025 年 6 月 4 日的某个时刻到期。除此之外,本机时间不准、CDN 节点仍返回旧证书、TLS 中间设备替换了证书,或证书链中的其他证书失效,也会触发 NET::ERR_CERT_DATE_INVALID。
如果确认服务端返回的 *.alipaydev.com 证书已经过期,问题出在支付宝沙箱环境的服务端证书配置。调用方无法自行续期,只能等待平台更新证书或向支付宝技术支持反馈。
为什么同一天仍会判定为过期
证书有效期包含两个精确时间:
notBefore:证书开始生效的时间notAfter:证书停止生效的时间
浏览器会检查当前时间是否满足:
notBefore <= currentTime <= notAfter
例如,证书的实际到期时间可能是:
Jun 4 00:00:00 2025 GMT
北京时间比 UTC 快 8 小时,对应:
2025-06-04 08:00:00 CST
北京时间 6 月 4 日上午 8 点以后,浏览器就会认为证书已经过期。即使证书详情页和系统日期都显示 Jun 4, 2025,验证结果仍然无效。
界面也可能按其他时区显示日期,因此不能只比较页面上的日期,必须查看完整的 notAfter 时间。
第一步:检查本机时间
先确认设备的日期、时间和时区准确无误。系统时间过快或过慢,都可能让浏览器误判证书尚未生效或已经过期。
macOS 或 Linux 可以执行:
date
date -u
Windows PowerShell 可以执行:
Get-Date
Get-TimeZone
w32tm /query /status
需要检查:
- 年、月、日是否正确
- 时区是否正确
- 系统是否启用了自动校时
- 虚拟机、容器或远程桌面的时间是否与宿主机同步
修正时间后,完全退出浏览器,再重新访问。不要故意调慢系统时间来绕过证书错误,否则可能影响登录凭证、Cookie、签名验证和其他 HTTPS 请求。
第二步:查看服务器实际返回的证书
使用 OpenSSL 查看服务器当前提供的证书及其精确有效期:
openssl s_client \
-connect unitradeprod-sandbox.dl.alipaydev.com:443 \
-servername unitradeprod-sandbox.dl.alipaydev.com \
</dev/null 2>/dev/null |
openssl x509 -noout -subject -issuer -serial -dates
输出通常类似:
subject=CN=*.alipaydev.com
issuer=...
notBefore=...
notAfter=Jun 4 00:00:00 2025 GMT
判断到期时间时,应以 notAfter 后面的完整时间和 GMT 时区为准。
-servername 参数不能省略,因为它负责发送 SNI。一个 IP 地址可能托管多个 HTTPS 站点。如果没有发送正确的 SNI,服务器可能返回另一张证书。
还可以让 OpenSSL 验证证书链:
openssl s_client \
-connect unitradeprod-sandbox.dl.alipaydev.com:443 \
-servername unitradeprod-sandbox.dl.alipaydev.com \
-showcerts \
-verify_return_error \
</dev/null
查看输出中的:
Verify return code
如果返回值不是零,需要结合后面的错误说明,判断问题是证书过期、证书链不完整,还是其他验证错误。
第三步:检查不同网络和节点
如果 OpenSSL 返回的是新证书,但浏览器仍提示旧证书过期,可能是不同网络路径收到了不同证书。常见原因有:
- CDN 或负载均衡节点的证书更新不一致
- DNS 将不同用户解析到不同节点
- 公司代理、防火墙或安全软件执行了 HTTPS 检查
- 浏览器或操作系统保留了旧的 TLS 会话
- IPv4 与 IPv6 连接到了不同节点
先查看域名解析结果:
nslookup unitradeprod-sandbox.dl.alipaydev.com
或者:
dig unitradeprod-sandbox.dl.alipaydev.com A
dig unitradeprod-sandbox.dl.alipaydev.com AAAA
可以分别在这些环境中测试:
- 当前网络
- 手机热点
- 另一台设备
- 无痕窗口
- 关闭代理或 VPN 后的网络
- 不同的 DNS 解析环境
也可以使用 curl 快速确认 TLS 验证结果:
curl -vI https://unitradeprod-sandbox.dl.alipaydev.com/
不要添加 -k 或 --insecure。这两个选项会让 curl 跳过证书验证,无法准确复现问题。
如果错误只在公司网络中出现,请检查浏览器显示的证书颁发者。若颁发者变成了公司内部 CA、安全软件或代理产品,而不是预期的 DigiCert 证书链,连接可能遭到了 TLS 代理拦截。
第四步:排除浏览器缓存和 TLS 状态影响
可以按顺序尝试:
- 完全退出并重新启动浏览器。
- 使用无痕窗口访问。
- 清理操作系统的 DNS 缓存。
- 暂时关闭代理、VPN 或 HTTPS 扫描功能,然后重新测试。
- 换用其他浏览器或设备。
- 对比浏览器中的证书信息与 OpenSSL 输出的序列号和
notAfter。
如果不同工具看到的证书序列号不同,通常表示请求到达了不同的服务节点,或中间设备替换了证书。
如何判断责任范围
可以根据检查结果定位问题:
| 检查结果 | 可能原因 | 处理方式 |
|---|---|---|
| 多个网络均返回同一张过期证书 | 服务端证书已过期 | 联系支付宝技术支持,等待服务端续期 |
| 只有某个网络返回过期证书 | CDN 节点、代理或网络缓存异常 | 更换网络,并向对应网络或平台方反馈 |
| 只有一台设备报错 | 本机时间、浏览器状态或安全软件异常 | 校准时间、重启浏览器并检查 HTTPS 扫描 |
| OpenSSL 返回新证书,浏览器显示旧证书 | TLS 会话、代理或浏览器环境问题 | 重启浏览器,对比证书序列号和颁发者 |
| IPv4 和 IPv6 返回不同证书 | 不同入口节点配置不一致 | 将两组检测结果一并反馈给服务方 |
| 证书本身未过期,但链验证失败 | 中间证书或信任库问题 | 检查完整证书链和系统根证书库 |
服务端问题应如何反馈
如果可以稳定复现服务端证书过期,反馈时最好附上:
- 出错域名和完整 URL
- 错误发生时间及所在时区
openssl s_client的验证结果- 证书的 Subject、Issuer、序列号和完整
notAfter - DNS 解析得到的 IP 地址
- 使用的网络环境
- IPv4、IPv6 是否都能复现
- 浏览器错误码
NET::ERR_CERT_DATE_INVALID
证书续期和部署只能由域名或服务端的管理方完成。客户端刷新页面、重新安装浏览器或修改业务代码,都无法修复一张确实已经过期的服务器证书。
注意事项
不要在支付流程中忽略 TLS 错误,也不要通过跳过证书验证继续联调。下面的做法只能用于极少数隔离环境中的临时诊断,不应写入业务代码:
curl -k https://unitradeprod-sandbox.dl.alipaydev.com/
也不要在 SDK 或 HTTP 客户端中关闭证书校验。即使访问的是沙箱环境,关闭验证仍会掩盖中间人攻击、代理替换证书和服务端配置错误。
最终应根据服务器返回证书的完整 notAfter 时间、证书链验证结果和准确的本机时间作出判断,不能只比较浏览器界面显示的年月日。
备注:内容仅供参考。
