You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:24:59