SpringBoot连接PostgreSQL SSL遇加密算法及密钥解析异常求助
解决SpringBoot 2.5.4(Java 11)连接PostgreSQL SSL异常问题
第一阶段异常:找不到加密算法1.2.840.113549.1.5.13
异常信息:
Caused by: org.postgresql.util.PSQLException: Could not find a java cryptographic algorithm: Cannot find any provider supporting 1.2.840.113549.1.5.13. at org.postgresql.ssl.LazyKeyManager.getPrivateKey(LazyKeyManager.java:271) ... Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting 1.2.840.113549.1.5.13 at java.base/javax.crypto.Cipher.getInstance(Cipher.java:565) at org.postgresql.ssl.LazyKeyManager.getPrivateKey(LazyKeyManager.java:223) ... 144 common frames omitted
连接URL配置:
jdbc:postgresql://hostname:5432/dbname?sslmode=require&sslcert=D:\work\linux\postgres-ssl\postgresql.crt&sslkey=D:\work\linux\postgres-ssl\postgresql.pk8&sslrootcert=D:\work\linux\postgres-ssl\root.crt&sslpassword=password
更新后的异常:私钥解密失败
重新执行密钥生成命令openssl pkcs8 -topk8 -v1 PBE-SHA1-3DES -inform PEM -outform DER -in postgresql.key -out postgresql.pk8后,出现新异常:
Caused by: java.security.spec.InvalidKeySpecException: Cannot retrieve the PKCS8EncodedKeySpec at java.base/javax.crypto.EncryptedPrivateKeyInfo.getKeySpec(EncryptedPrivateKeyInfo.java:258) at org.postgresql.ssl.LazyKeyManager.getPrivateKey(LazyKeyManager.java:257) ... 144 common frames omitted Caused by: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption. at java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975) ...
解决方案
1. 核心原因分析
- 第一阶段的算法
1.2.840.113549.1.5.13对应PBEWithSHA1AndRC2_40,属于弱加密算法,Java 11默认加密提供者(SunJCE)已移除对该算法的支持。 - 第二阶段的
BadPaddingException通常是密码不匹配或加密算法与Java解密逻辑不兼容导致。
2. 具体解决步骤
方案一:生成无加密的PKCS8私钥(推荐)
避免加密算法兼容性问题,直接生成不加密的PKCS8格式私钥:
openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in postgresql.key -out postgresql.pk8
生成后,修改连接URL,移除sslpassword参数:
jdbc:postgresql://hostname:5432/dbname?sslmode=require&sslcert=D:\work\linux\postgres-ssl\postgresql.crt&sslkey=D:\work\linux\postgres-ssl\postgresql.pk8&sslrootcert=D:\work\linux\postgres-ssl\root.crt
方案二:使用Java支持的加密算法生成密钥
如果必须使用加密的私钥,选择Java 11支持的算法(如AES-256-CBC):
openssl pkcs8 -topk8 -v2 aes-256-cbc -v2prf hmac-sha256 -inform PEM -outform DER -in postgresql.key -out postgresql.pk8
执行命令时输入的密码必须与连接URL中sslpassword参数完全一致,注意大小写、特殊字符的正确性。
3. 额外验证步骤
- 确认证书与私钥配对:执行以下两个命令,输出的MD5值必须相同
openssl x509 -noout -modulus -in postgresql.crt | openssl md5 openssl rsa -noout -modulus -in postgresql.key | openssl md5 - 检查Java加密策略:Java 11默认已启用无限制加密策略,无需额外配置;若仍有问题,可确认
$JAVA_HOME/conf/security/java.security文件中是否包含crypto.policy=unlimited。
内容的提问来源于stack exchange,提问作者Faheem Sultan
相关产品推荐
相关产品推荐

