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
相关产品推荐
相关产品推荐

