在Ubuntu 18.04中,此错误有不同的原因(JEP 229,从jks
密钥库默认格式切换为该pkcs12
格式,以及使用新文件的默认Debian cacerts文件生成)和解决方法:
# Ubuntu 18.04 and various Docker images such as openjdk:9-jdk throw exceptions when
# Java applications use SSL and HTTPS, because Java 9 changed a file format, if you
# create that file from scratch, like Debian / Ubuntu do.
#
# Before applying, run your application with the Java command line parameter
# java -Djavax.net.ssl.trustStorePassword=changeit ...
# to verify that this workaround is relevant to your particular issue.
#
# The parameter by itself can be used as a workaround, as well.
# 0. First make yourself root with 'sudo bash'.
# 1. Save an empty JKS file with the default 'changeit' password for Java cacerts.
# Use 'printf' instead of 'echo' for Dockerfile RUN compatibility.
/usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts
# 2. Re-add all the CA certs into the previously empty file.
/var/lib/dpkg/info/ca-certificates-java.postinst configure
状态(2018-08-07),该错误已在Ubuntu Bionic LTS 18.04.1和Ubuntu Cosmic 18.10中修复。
🗹Ubuntu 1770553:[SRU]从cosmic向后移植ca-certificates-java(20180413ubuntu1)
🗹Ubuntu 1769013:请合并来自Debian不稳定(主要)的ca-certificates-java 20180413(主要)
🗹Ubuntu 1739631:使用JDK 9进行的全新安装无法使用生成的PKCS12 cacerts密钥库文件
🗹docker -library 145:9-jdk映像具有SSL问题
🗹Debian 894979:ca-certificates-java:不适用于OpenJDK 9,应用程序失败,出现InvalidAlgorithmParameterException:trustAnchors参数必须为非空
🗹JDK -8044445:JEP 229:默认情况下创建PKCS12密钥库
EP JEP 229:默认情况下创建PKCS12密钥库
如果在解决方法之后问题仍然存在,则可能需要确保您实际上正在运行刚刚修复的Java发行版。
$ which java
/usr/bin/java
您可以使用以下方法将Java替代设置为“自动”:
$ sudo update-java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so
您可以再次检查正在执行的Java版本:
$ java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
也有其他解决方法,但是这些解决方法都有其自己的副作用,这些副作用需要将来进行额外的维护,而无任何回报。
下一个最佳解决方法是添加行
javax.net.ssl.trustStorePassword=changeit
到文件
/etc/java-9-openjdk/management/management.properties
/etc/java-11-openjdk/management/management.properties
以任何一个存在。
问题最少的第三种解决方法是更改
keystore.type=pkcs12
至
keystore.type=jks
在文件中
/etc/java-9-openjdk/security/java.security
/etc/java-11-openjdk/security/java.security
删除存在的cacerts
文件,然后删除该文件,并按照帖子顶部变通方法脚本最后一行中所述的方式重新生成该文件。