最近在公司部分服务往 k8s 迁移的工作中,有个服务第一次镜像打包并在 k8s 中部署后,发现在访问 Apple Push Server(https://api.push.apple.com )会报证书验证错误: not a valid x509 certificate

心想,大厂 Apple 不至于证书配置错误吧,赶紧浏览器访问下,确实一切正常.

alt ApplePushServerCert

联想到这个服务原来还是跑在一台比较古老的 EC2 上,以及最近 golang 服务因为 k8s dns 问题,基础镜像均使用了 Debian,于是怀疑是不是最近 Debian 证书更新导致了某些 CA ROOT 被移除,Google 了下,果然发现,2020.06 的证书更新中,移除了某些 CA ROOT: ca-certificates: Removal of GeoTrust Global CA requires investigation .

从图中的 Apple Api Push 域名的证书链中,能发现 Apple IST CA2 - G1 证书由 GeoTrust Global CA 交叉签名出来的 CA,而 GeoTrust Global CA 属于 Symantec,Symantec 在 2018 年由于不规范签发证书,被 Google 以及 Mozilla 等在 2018 年就决定被不信任。

和浏览器不一样,主流 OS 仅维护一个ca-certificates包,并没有什么证书白名单等处理,因此当 Debian 移除了部分 CA 后,程序访问相关证书的网站会直接报错。

由于 Apple 也在慢慢淘汰 Symantec 系列的 CA,因此,本质上问题还是 Apple Push 不应该使用 GeoTrust ROOT CA 包括其交叉签名出的 ROOT CA 所签发出的证书,而既然 Apple 已经这(dian)么(da)做(qi)了(ke),当然选择兼容他啦(如同主流浏览器白名单)!

解决方案

最佳实践当然是和 Mozilla 一样,做个证书白名单,但是稍微麻烦点。Symantec 随便不被信任了,但是也不至于乱签发证书以及挺多厂商可能也没来得及换,所以直接重新信任GeoTrust Global CA也是可以的。

这里以基于 Debian 的镜像处理为例:

RUN mkdir /usr/local/share/ca-certificates/geo-trust-global-ca && \
    wget -P /usr/local/share/ca-certificates/geo-trust-global-ca/root.crt https://www.geotrust.com/resources/root_certificates/certificates/GeoTrust_Global_CA.pem && \
    update-ca-certificates

Ref


comments powered by Disqus