【问题标题】:Java Algorithm constraints check failed on key RSA with size of 1024bitsJava 算法约束检查在大小为 1024 位的密钥 RSA 上失败
【发布时间】:2019-07-05 03:41:54
【问题描述】:

使用以下命令生成 java 密钥库后:-keyalg RSA -keysize 2048 并配置 java.security 策略:

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, RSA keySize < 2048

我不断收到错误:

java.security.cert.CertPathValidatorException:对大小为 1024 位的密钥 RSA 的算法约束检查失败

我正在使用以下命令生成 2048 位 RSA 密钥:

keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore star_domain_name.jks -storetype PKCS12 -dname "CN=*.domain_name.com,OU=Engineering, O=Company Name., L=City Name, ST=State, C=US" && keytool -certreq -alias server -file star_domain_name.com.csr -keystore star_domain_name_io.jks

然后我通过以下方式验证上述内容:

openssl s_client -showcerts -connect localhost:443

这表明:

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2

我还通过以下方式查看密钥库:

keytool -list -v -keystore star_domain_name.com.jks

其中显示:

Certificate fingerprints:
         MD5:  67:4C:04:90:35:etc...etc...
         SHA1: AD:C8:06:74:3A:F1:72:etc...etc...
         SHA256: C5:D6:81:3B:C1:F7:CE:2D:43:91:06:E9:9etc...etc...
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key

在我所见的任何地方,我都能看到 2048 位 RSA 密钥。 但是,当我想在我的 java spring boot 应用程序中使用 java keystore 时,它​​一直在抱怨:

  • 原因:java.security.cert.CertPathValidatorException:对大小为 1024 位的密钥 RSA 的算法约束检查失败
  • 原因:java.security.cert.CertificateException:证书不符合算法约束

一旦我编辑 java.security 文件,并从中删除 RSA keySize

这是因为我没有导入签名的域证书吗? 为什么应用程序会报错,尽管我已将策略和 java 密钥库配置为 2048 位?

我的 java 应用程序配置包含:

ssl.key-store: /opt/cert_path/star_domain_name.com.jks
ssl.enabled: true
ssl.key-store-password: the_password_etc...
ssl.key-store-type: PKCS12
ssl.key-alias: tomcat

一旦我编辑 java.security 文件,并从中删除 RSA keySize

这是因为我没有导入签名的域证书并且密钥库是空的吗?我怀疑。

为什么我清楚地为 2048 位配置了策略文件和 java 密钥库,但应用程序仍然报错?

java.security 文件还包含:

jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024

那也要调整吗?

我实际上已经尝试过调整,但没有效果......

【问题讨论】:

  • 您好,欢迎来到Stack Overflow!有趣的问题!您还可以分享/告诉我们您的 java 版本吗?
  • java.security.cert.CertPathValidatorException ....“也试试”jdk.certpath.disabledAlgorithms(...除了jdk.tls...jdk.jar...
  • ..据我了解问题/问题:2048 键失败。@user207421。令人困惑的 1:“一旦我编辑 java.security 文件,并从中删除 RSA keySize 1024bits" 的密钥 RSA 的算法约束检查失败
  • 认为,你有一个 2048 密钥,@SUP3RS3T,但是“混淆 1. + 2.”(我之前的评论)符合事实,即“spring boot 使用另一个带有 1024b" 的键!
  • 您使用 JDK 的哪个版本?你有 JSSE 吗?

标签: java ssl keystore


【解决方案1】:

我纠结了很久,终于找到了解决办法。

所以每当我修改文件java.security 时,它都不会起作用,因为有第二个文件java.config(在Linux 上它位于:/etc/crypto-policies/back-ends/java.config)覆盖java.security 中的参数。

这是由属性控制的(java.security):

security.useSystemPropertiesFile=true

所以,要么将该属性更改为false,要么直接在java.config 中修改参数。

这对我有用!

【讨论】:

    【解决方案2】:

    只是想补充一下。通过添加启用证书调试后

    -Djava.security.debug=certpath
    

    所以,举个例子:

    java -Xms64m -Xmx512m -Djava.security.debug=certpath -Dspring.config.location=config.file -jar appname.jar &>> logfile.log &
    

    我终于明白为什么 Java 会抱怨了。 显然加密的 AWS RDS 实例使用 1024 位的 SSL 证书。当我的 java 应用程序调用它时,它们会失败,因为它们的策略设置为仅接受 RSA

    我联系了 AWS 以获得进一步的指导。

    如果有人正在努力解决 Java 证书问题,请使用:

    -Djava.security.debug=certpath
    

    非常有用。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2014-06-24
      • 2021-04-15
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多