随记:阿里云 docker 切换到 containerd 遇到 CertPathValidatorException 问题

197 阅读1分钟

遇到个容器切换遇到的问题,记录下。

问题:阿里云集群升级,原有的 docker 更换为 containerd,服务启动后发现报错,错误如下:

java.security.cert.CertPathValidatorException: Algorithm constraints check failed on key RSA with size of 1024bits

环境

  • jdk 版本:openJdk 11

猜测:

  • 这次升级代码是没有变动的,只是更换了容器,怀疑是容器问题。
  • 服务有用到 openssl 生成的证书,根据错误可知对大小为 1024 位的证书密钥校验失败了,当时想到了 jdkjava.security 文件,但是除了容器,其它都是一样的。。
  • 抱着疑问去 stackoverflow 搜索了下相关错误,还真找到了,这里贴下链接 https://stackoverflow.com/questions/54634060/java-algorithm-constraints-check-failed-on-key-rsa-with-size-of-1024bits (🐮🍺)

原因及解决方案:

  • 解决方案:启动参数添加 -Djava.security.disableSystemPropertiesFile=true
  • 原因:
    • linux 中有第二个 java.config 文件,位于 /etc/crypto-policies/back-ends/java.config,该文件的配置会覆盖 java.security 的参数。
    • image.png
    • 进入容器查看配置文件,通过以上截图发现第二行的禁用中有 keySize < 2048 的配置(报错原因),而 java.security 配置默认是优先使用系统配置文件。
    • 而控制使用系统配置的属性是 java.security 中的 security.useSystemPropertiesFile=true
    • 这次容器升级后进入容器内按照路径发现了该配置文件,于是跟之前的旧容器进行了比对,发现通过 docker 部署的容器是没有这个文件的,问题找到,接下来就是怎么改的事了。
    • 更改方式挺多的,比如直接更改覆盖配置的属性为 false,或者通过挂载,但是都不够优雅,后面发现可以通过添加启动参数 -Djava.security.disableSystemPropertiesFile=true 解决,就此添加参数后服务启动正常,完美。