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

SUP*_*S3T 6 java ssl keystore

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

\n\n
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, RSA keySize < 2048\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不断收到错误:

\n\n
\n

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

\n
\n\n

I\xe2\x80\x99m 使用以下命令生成 2048 位 RSA 密钥:

\n\n
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\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我用以下方法验证上述内容:

\n\n
openssl s_client -showcerts -connect localhost:443\n
Run Code Online (Sandbox Code Playgroud)\n\n

这表明:

\n\n
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384\nServer public key is 2048 bit\nSecure Renegotiation IS supported\nCompression: NONE\nExpansion: NONE\nNo ALPN negotiated\nSSL-Session:\n    Protocol  : TLSv1.2\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还使用以下命令查看密钥库:

\n\n
keytool -list -v -keystore star_domain_name.com.jks\n
Run Code Online (Sandbox Code Playgroud)\n\n

这表明:

\n\n
Certificate fingerprints:\n         MD5:  67:4C:04:90:35:etc...etc...\n         SHA1: AD:C8:06:74:3A:F1:72:etc...etc...\n         SHA256: C5:D6:81:3B:C1:F7:CE:2D:43:91:06:E9:9etc...etc...\nSignature algorithm name: SHA256withRSA\nSubject Public Key Algorithm: 2048-bit RSA key\n
Run Code Online (Sandbox Code Playgroud)\n\n

我到处都能看到 2048 位 RSA 密钥。\n但是,当我想在 java spring boot 应用程序中使用 java 密钥库时,它不断抱怨:

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

一旦我编辑 java.security 文件,并从中删除 RSA keySize < 2048,然后重新启动应用程序,一切都会正常\xe2\x80\xa6

\n\n

这是因为我没有导入签名的域证书吗?\n尽管我明确配置了 2048 位的策略和 java 密钥库,但为什么应用程序会抱怨?

\n\n

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

\n\n
ssl.key-store: /opt/cert_path/star_domain_name.com.jks\nssl.enabled: true\nssl.key-store-password: the_password_etc...\nssl.key-store-type: PKCS12\nssl.key-alias: tomcat\n
Run Code Online (Sandbox Code Playgroud)\n\n

一旦我编辑 java.security 文件,并从中删除 RSA keySize < 2048,然后重新启动应用程序,一切都会正常\xe2\x80\xa6

\n\n

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

\n\n

尽管我明确配置了 2048 位的策略文件和 java 密钥库,但为什么应用程序会抱怨?

\n\n

java.security 文件还包含:

\n\n
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024\n
Run Code Online (Sandbox Code Playgroud)\n\n

是不是也应该调整一下呢?

\n\n

其实我也尝试过调整,但没有效果……

\n

ake*_*lec 7

我被这个问题困扰了很长时间,最后我找到了解决方案。

因此,每当我修改该文件时java.security,它都不会产生任何效果,因为有第二个文件java.config(在 Linux 上它位于:)/etc/crypto-policies/back-ends/java.config覆盖了 中的参数java.security

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

security.useSystemPropertiesFile=true

因此,要么将该属性更改为false,要么直接修改 params java.config

这对我有用!


SUP*_*S3T 2

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

-Djava.security.debug=certpath
Run Code Online (Sandbox Code Playgroud)

因此,举个例子:

java -Xms64m -Xmx512m -Djava.security.debug=certpath -Dspring.config.location=config.file -jar appname.jar &>> logfile.log &
Run Code Online (Sandbox Code Playgroud)

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

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

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

-Djava.security.debug=certpath
Run Code Online (Sandbox Code Playgroud)

这非常有帮助。

谢谢。