使用以下命令生成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:大小为1024bits的密钥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启动应用程序中使用java密钥库时,它会一直抱怨:
- 引起:java.security.cert.CertPathValidatorException:大小为1024bits的密钥RSA上的算法约束检查失败
- 引起:java.security.cert.CertificateException:证书不符合算法约束
一旦我编辑java.security文件,并从中删除RSA keySize <2048,并重新启动应用程序,一切正常......
这是因为我没有导入签名域名证书吗?尽管我明确地将策略和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,并重新启动应用程序,一切正常......
这是因为我没有导入签名的域证书,密钥库是空的吗?我对此表示怀疑。
尽管我明确配置了2048位的策略文件和java密钥库,但为什么应用程序会抱怨?
java.security文件还包含:
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024
这还应该调整吗?
我实际上试图调整它,但这没有效果......
只是想加入这个。通过添加启用证书调试后
-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
这非常有帮助。
谢谢。