遇到个容器切换遇到的问题,记录下。
问题:阿里云集群升级,原有的 docker 更换为 containerd,服务启动后发现报错,错误如下:
java.security.cert.CertPathValidatorException: Algorithm constraints check failed on key RSA with size of 1024bits
环境
jdk版本:openJdk 11
猜测:
- 这次升级代码是没有变动的,只是更换了容器,怀疑是容器问题。
- 服务有用到
openssl生成的证书,根据错误可知对大小为 1024 位的证书密钥校验失败了,当时想到了jdk的java.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的参数。- 进入容器查看配置文件,通过以上截图发现第二行的禁用中有
keySize < 2048的配置(报错原因),而java.security配置默认是优先使用系统配置文件。 - 而控制使用系统配置的属性是
java.security中的security.useSystemPropertiesFile=true - 这次容器升级后进入容器内按照路径发现了该配置文件,于是跟之前的旧容器进行了比对,发现通过
docker部署的容器是没有这个文件的,问题找到,接下来就是怎么改的事了。 - 更改方式挺多的,比如直接更改覆盖配置的属性为
false,或者通过挂载,但是都不够优雅,后面发现可以通过添加启动参数-Djava.security.disableSystemPropertiesFile=true解决,就此添加参数后服务启动正常,完美。