从JDK10升级至JDK11时TLS握手出现CKR_KEY_TYPE_INCONSISTENT错误
OpenJDK 10升级至11后PKCS11 TLS握手异常问题解答
1. 是否需要修改java.security配置文件?
如需启用被标记为legacy的算法,可选择修改java.security配置文件,也可通过JVM启动参数临时调整,无需修改全局配置:
- 全局生效场景:直接修改JDK目录下的
conf/security/java.security文件即可。 - 单应用生效场景:直接在启动命令中添加参数覆盖默认安全策略,无需改动全局配置文件。
2. rsa_pkcs1_sha256与SHA256withRSA有什么区别?
二者本质是同一种签名算法,仅命名规则和使用场景不同:
SHA256withRSA是Java加密架构(JCA)的标准算法命名,指代采用PKCS#1 v1.5填充、SHA256做摘要的RSA签名算法,通常用于底层加密API调用时的算法指定。rsa_pkcs1_sha256是TLS协议层面的算法命名,用于TLS握手阶段的签名算法协商,底层实现对应JCA标准的SHA256withRSA。
3. 该问题是否由提供方和“DISABLED due to legacy”的标记导致?
是。OpenJDK 11收紧了默认安全策略,将旧版RSA PKCS#1 v1.5相关签名算法标记为legacy并加入默认限制/禁用列表。SunPKCS11提供方调用硬件卡私钥做签名前,会先校验算法是否在允许列表内,被标记为禁用的算法会直接被过滤,最终导致无适配提供方处理P11私钥,触发CKR_KEY_TYPE_INCONSISTENT错误。
4. 是否可以强制启用被标记为legacy禁用的算法?
可以强制启用,可选两种实现方式:
- 全局生效:修改JDK安装目录下
conf/security/java.security文件,找到jdk.tls.disabledAlgorithms和jdk.security.legacyAlgorithms两个配置项,将rsa_pkcs1_sha256、rsa_pkcs1_sha384等需要用到的算法从配置值中移除,保存后重启应用即可。 - 单应用生效:启动应用时添加JVM参数覆盖默认配置,示例参数如下:
-Djdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL -Djdk.security.legacyAlgorithms=SHA1usage, MD5usage, DSA, RSA keySize < 2048
注意:上述参数值需根据自身安全需求调整,仅移除实际需要使用的算法,不要直接清空禁用列表,避免引入不必要的安全风险。
内容的提问来源于stack exchange,提问作者Fabian Monnay
相关产品推荐
相关产品推荐

