pgJDBC 加载私钥报 MalformedInputException,DER 文件别用 .key 后缀
升级 pgJDBC 后客户端私钥突然读不出来,若 DER 编码的 PKCS#8 文件名以 .key 结尾,检查是否被当作 PEM 文本解析。
升级 pgJDBC 后,连接报 Could not load the private key,内层是 java.nio.charset.MalformedInputException: Input length = 1,堆栈经过 PEMKeyManager。若私钥实际是 DER 编码,却使用 .key 后缀,应检查是否选错了解析路径。
这个明确场景涉及 pgJDBC 42.7.9 到 42.7.10 的相关版本。42.7.10 的实现按文件名选择:.key、.pem 进入 PEM 文本读取,.p12、.pfx 进入对应容器读取,其他名称进入 PKCS#8 路径。二进制 DER 被按文本读取,可能在真正使用密钥前就出现字符解码错误。
先确认编码,不靠后缀猜测
核对原来的密钥生成或导出步骤,以及部署记录中的格式。PEM 通常有文本边界行;DER 是二进制编码。不要把私钥内容粘进日志、聊天或在线格式识别工具。
这里的绕行只适用于已经确认是驱动可用的 PKCS#8 DER 私钥。一个任意二进制文件改名为 .der,不会自动转换格式;传统 RSA 私钥、加密方式不支持或密钥本身损坏,都要按实际格式另行处理。
保留原件,调整部署路径
将已确认的 DER 私钥按原有秘密文件管理方式保留一份副本,使用 .der 或项目原先验证过的非 PEM 后缀,并把 JDBC 的 sslkey 指向该路径。不要直接覆盖唯一密钥;保留可恢复的原配置。
复制或更新挂载后,检查文件权限和运行用户读取权限没有扩大。容器内配置应使用容器实际路径,更新宿主文件名不会自动修改已有的 secret 挂载名或应用配置。
如果项目选择转成 PEM,应使用受控的本地密钥处理流程,明确输入的 PKCS#8 与加密形式,并核对输出仍匹配客户端证书;无需仅为绕过后缀分支重新生成整套证书。
不通过关闭 TLS 消除读取错误
保持原来的 sslmode、根证书与主机名验证策略。这条错误发生在客户端私钥加载,关闭证书校验不会让二进制文件变成 PEM,还会改变连接的安全边界。
新连接验收要确认客户端证书认证仍被服务器接受,服务端证书和主机名验证仍按原策略执行,且应用运行账户只读取预期私钥。只验证 TCP 或数据库密码登录成功,不能证明原客户端证书链路恢复。
如果升级到后续驱动,先核对正式版本对密钥格式检测的行为,再决定是否恢复旧文件名;开发分支或未发布的自动检测改动不能当成当前安装包已经支持。回退时恢复配套路径配置,保留密钥原件,无需撤销或替换仍有效的证书。


