解决JAVA无法验证证书将不执行该应用程序提示
解决JAVA“无法验证证书。将不执行该应用程序。”提示
笔者的一台电脑安装了Java 8 update 361。
需要使用UBNT网桥上的AirView应用(JAVA),但运行时提示:
应用程序出于安全原因被阻止
无法验证证书。
将不执行该应用程序。
名称:AirView
发行者:Ubiquiti Inc.
位置:http://172.16.x.x:80
笔者先前已经在控制面板——Java——安全——“例外站点”列表中加入了上述地址,在以前的旧版Java上是可以正常运行的。
但自从Java更新到某个版本后(具体无从考证了),就出现了这个“无法验证证书”的问题。
笔者又尝试在控制面板——Java——高级中,将几个证书撤销检查设置为“不检查”。但仍然没有效果,依旧报告相同的错误信息。
既然是证书有问题,那就在弹出提示时,查看一下JAVA应用的证书。
发现应用的证书是SHA256算法。但在证书路径中,有父(根)证书在使用SHA1算法。
那么会不会是SHA1算法被JAVA所禁止了?
答案就在C:\Program Files\Java\jre1.8.0_361\lib\security\java.security文件中。
发现这么几行:
jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224, \
include jdk.disabled.namedCurves, \
SHA1 usage SignedJAR & denyAfter 2019-01-01
又上网查询了一下,官方讲得很清楚:
JARs signed with SHA-1 algorithms are now restricted by default and treated as if they were unsigned.
Any JAR signed with SHA-1 algorithms and timestamped prior to January 01, 2019 will NOT be restricted.
Users can, at their own risk , remove these restrictions by modifying the
java.security
configuration file (or override it by using thejava.security.properties
system property) and removing “SHA1 usage SignedJAR & denyAfter 2019-01-01” from thejdk.certpath.disabledAlgorithms
security property and “SHA1 denyAfter 2019-01-01” from thejdk.jar.disabledAlgorithms
security property.
[Java™ SE Development Kit 11, 11.0.17 Release Notes
“Java™ SE Development Kit 11, 11.0.17 Release Notes”)
也就是说,JRE从某个版本开始(大约是2021年的第三季度),默认阻止签名证书使用SHA1算法的应用。但也有例外,就是签名时间戳早于2019年1月1日的,不受此限制。
因此,只需要在java.security文件中找到两行带有“denyAfter 2019-01-01”的代码,用#将其注释掉即可。
保存文件,之后就可以运行先前的java应用了。