JDK 1.8.0_371下sshj缺失加密算法提供商问题求助
使用sshj时出现如下报错日志:
Cannot find any provider supporting CAST5/CTR/NoPadding Cannot find any provider supporting IDEA/CTR/NoPadding Cannot find any provider supporting Serpent/CBC/NoPadding Cannot find any provider supporting Serpent/CTR/NoPadding Cannot find any provider supporting Twofish/CBC/NoPadding Cannot find any provider supporting Twofish/CTR/NoPadding Disabling high-strength ciphers: cipher strengths apparently limited by JCE polic
当前使用JDK 1.8.0_371,根据官方说明Java 8u151及以上版本默认启用JCE无限制加密策略,但该问题仅在一台虚拟机上出现,另一台正常。
在两台虚拟机上执行以下代码打印支持的加密算法:
Set<String> algs = new TreeSet<>(); for (Provider provider : Security.getProviders()) { provider.getServices().stream() .filter(s -> "Cipher".equals(s.getType())) .map(Provider.Service::getAlgorithm) .forEach(algs::add); } algs.forEach(System.out::println);
得到的输出完全一致:
AES AESWrap AESWrap_128 AESWrap_192 AESWrap_256 AES_128/CBC/NoPadding AES_128/CFB/NoPadding AES_128/ECB/NoPadding AES_128/GCM/NoPadding AES_128/OFB/NoPadding AES_192/CBC/NoPadding AES_192/CFB/NoPadding AES_192/ECB/NoPadding AES_192/GCM/NoPadding AES_192/OFB/NoPadding AES_256/CBC/NoPadding AES_256/CFB/NoPadding AES_256/ECB/NoPadding AES_256/GCM/NoPadding AES_256/OFB/NoPadding ARCFOUR Blowfish DES DESede DESedeWrap PBEWithHmacSHA1AndAES_128 PBEWithHmacSHA1AndAES_256 PBEWithHmacSHA224AndAES_128 PBEWithHmacSHA224AndAES_256 PBEWithHmacSHA256AndAES_128 PBEWithHmacSHA256AndAES_256 PBEWithHmacSHA384AndAES_128 PBEWithHmacSHA384AndAES_256 PBEWithHmacSHA512AndAES_128 PBEWithHmacSHA512AndAES_256 PBEWithMD5AndDES PBEWithMD5AndTripleDES PBEWithSHA1AndDESede PBEWithSHA1AndRC2_128 PBEWithSHA1AndRC2_40 PBEWithSHA1AndRC4_128 PBEWithSHA1AndRC4_40 RC2 RSA
请问遗漏了什么配置?是否是密钥存在问题?
针对两台机器环境一致但表现不同的情况,可从以下几个方面排查:
1. 检查JCE策略文件状态
虽然Java 8u151+默认启用无限制加密策略,但仍需确认$JAVA_HOME/jre/lib/security目录下的local_policy.jar和US_export_policy.jar是否为无限制版本。若这两个文件是旧版限制文件,会覆盖默认策略:
- 正常无限制版本的
local_policy.jar中,default_local.policy应包含grant { permission javax.crypto.CryptoPermission "*", "unlimited"; }; - 若存在旧文件,替换为JDK安装包自带的无限制版本(通常在
$JAVA_HOME/jre/lib/security/unlimited目录下)。
2. 检查java.security配置
打开$JAVA_HOME/jre/lib/security/java.security文件,查找crypto.policy配置项:
- 确保配置为
crypto.policy=unlimited,若被注释或设置为limited,会强制启用限制策略。 - 修改后需重启应用生效。
3. 检查自定义安全配置参数
确认应用启动时是否通过-Djava.security.properties=/path/to/custom/java.security参数加载了外部安全配置文件,该配置可能覆盖默认加密策略。
4. 调整SSHJ的Cipher列表
报错中提到的CAST5、IDEA、Serpent、Twofish等算法并非JDK默认支持的加密算法,SSHJ默认会尝试这些算法。可自定义SSHJ的Cipher列表,只保留JDK支持的算法来避免报错:
SSHClient ssh = new SSHClient(); ssh.getConfig().setCipherOrder(Arrays.asList( "aes256-ctr", "aes192-ctr", "aes128-ctr", "aes256-cbc", "aes192-cbc", "aes128-cbc", "blowfish-cbc", "3des-cbc" ));
5. 检查文件权限
确认$JAVA_HOME/jre/lib/security目录及其下的java.security、策略文件等是否允许当前应用用户读取。权限不足会导致JVM无法加载正确的加密策略配置。
内容的提问来源于stack exchange,提问作者Jigar Shah

