ssl 对大小为1024位的密钥RSA进行Java算法约束检查失败

mznpcxlj  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(76)

在使用以下命令生成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密钥库时,它一直在抱怨:

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

只要我编辑java.security文件,并从其中删除RSA keySize < 2048,并重新启动应用程序,一切正常.
这是因为我没有导入一个签名的域证书吗?为什么应用程序抱怨,尽管我明确配置了2048位的策略和java密钥库?
我的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密钥库配置为2048位?
java.security文件还包含:

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


这也要调整吗?
实际上我试过调整,但没有效果...

shyt4zoc

shyt4zoc1#

我被这个问题困扰了很长时间,最后,我找到了解决办法。
因此,无论何时修改文件java.security,都不会产生任何影响,因为还有第二个文件java.config(在Linux上,它位于:/etc/crypto-policies/back-ends/java.config)覆盖了java.security中的参数。
这是由属性(在java.security中)控制的:
security.useSystemPropertiesFile=true
因此,要么将该属性更改为false,要么直接在java.config中修改参数。
这对我很有效!

r8uurelv

r8uurelv2#

只想添加到此。通过添加启用证书调试后

-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 < 2048 keySize。
我联系了AWS寻求进一步的指导。
如果有人正在努力解决Java证书问题,请使用:

-Djava.security.debug=certpath


非常有用。
谢谢

oknrviil

oknrviil3#

我已经成功地处理了那些关于RSA密钥大小的错误,方法是更改Java配置,以允许我试图通信的目标服务器使用的密钥大小。这几乎是这里其他答案所涵盖的内容,但这样你就可以确保所有的基础都被涵盖了。
1.查找操作系统文件系统中的所有java.config和java.security文件:
find / -iname java.config
java.security
1.访问其中的每一个(vi/nano)并查找有关RSA密钥大小的配置(RSA keySize < X or RSA keySize >= Y)。在每个配置中,更改后面的运算符和值以满足您的需要,然后保存文件。例如,如果您的错误消息抱怨RSA 1024位密钥,您应该有以下内容:
RSA keySize < 1024(这意味着您不允许密钥小于1024位,因此1024或以上将是罚款)
1.重新启动服务。
就是这样。在我的情况下,我不得不改变4个文件来确保。上面的指南假设你使用的是Linux,但如果你没有,你可以调整命令到你的操作系统。

相关问题