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

Java转PEM密钥为DER失败,PostgreSQL JDBC SSL连接报错求助

解决PostgreSQL JDBC SSL连接中自定义DER密钥报错的问题

问题原因

你用Java直接解码PKCS#1格式的RSA私钥(开头是-----BEGIN RSA PRIVATE KEY-----)生成DER文件,但PostgreSQL JDBC驱动只认PKCS#8格式的DER私钥。而你用openssl pkcs8 -topk8命令转换时,刚好把PKCS#1转成了PKCS#8,所以那个文件能正常用。

修复方法

得在Java里把PKCS#1私钥转换成PKCS#8格式的DER,不能只是简单解码Base64。下面是修正后的代码:

修正后的转换代码

import java.io.FileOutputStream;
import java.io.StringReader;
import java.security.PrivateKey;
import org.bouncycastle.asn1.pkcs.RSAPrivateKey;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

public class KeyConverter {
    public static void main(String[] args) throws Exception {
        String serverKeyString = "-----BEGIN RSA PRIVATE KEY-----\r\n" + "***************\r\n" + "-----END RSA PRIVATE KEY-----";
        
        // 用BouncyCastle解析PKCS#1私钥
        PEMParser parser = new PEMParser(new StringReader(serverKeyString));
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) parser.readObject();
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
        PrivateKey pkcs8Key = converter.getPrivateKey(rsaPrivateKey);
        
        // 写入PKCS#8格式的DER文件
        try (FileOutputStream os = new FileOutputStream(".\\server-key.der")) {
            os.write(pkcs8Key.getEncoded());
        }
    }
}

依赖准备

需要在项目里加BouncyCastle的依赖(比如Maven):

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>

验证

用这个代码生成的server-key.der替换原来的文件,再跑你的JDBC连接代码,就能成功建立SSL连接了。

额外说明

  • PKCS#1是RSA专用的私钥格式,PKCS#8是通用格式,Java SSL和PostgreSQL驱动都支持它。
  • 你之前的代码只是把Base64转成二进制,没做格式转换,所以SSL握手时服务器不认这个密钥,才报了unexpected_message错误。

内容的提问来源于stack exchange,提问作者Ankit Kothiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:55:04