Java中无内置InvalidPrivateKeyException,需自定义继承GeneralSecurityException,并在加载私钥失败或校验不通过时主动抛出。

Java 中并没有内置的 InvalidPrivateKeyException,它不是 JDK 标准异常类。若想在 RSA 私钥不匹配(如格式错误、损坏、非对应公钥、非 PKCS#8 编码等)时抛出自定义异常,需自行定义并主动检测后抛出。
定义 InvalidPrivateKeyException 异常类
继承 GeneralSecurityException(语义更准确)或 RuntimeException(便于快速失败),推荐前者:
public class InvalidPrivateKeyException extends GeneralSecurityException {
public InvalidPrivateKeyException(String message) {
super(message);
}
public InvalidPrivateKeyException(String message, Throwable cause) {
super(message, cause);
}
}
检测私钥有效性再抛出异常
RSA 私钥是否“匹配”通常指:能成功加载、是合法 RSA 私钥、且与预期公钥模数一致(可选)。JDK 加载失败本身会抛出异常(如 InvalidKeySpecException),但需捕获并包装为自定义异常:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 使用
PKCS8EncodedKeySpec解析 Base64 或 DER 编码的私钥字节 - 用
KeyFactory.getInstance("RSA")生成PrivateKey - 若解析失败,捕获
InvalidKeySpecException或NullPointerException等,转为InvalidPrivateKeyException - 如需验证与公钥匹配,可比较私钥的
getModulus()和公钥的模数是否相等
示例:加载并校验私钥
以下代码在私钥无效时明确抛出 InvalidPrivateKeyException:
public static PrivateKey loadRSAPrivateKey(byte[] encodedKey)
throws InvalidPrivateKeyException {
try {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privateKey = kf.generatePrivate(keySpec);
// 可选:进一步校验(例如非 null、RSA 类型、模长合理)
if (!(privateKey instanceof RSAPrivateKey)) {
throw new InvalidPrivateKeyException("Not an RSA private key");
}
if (((RSAPrivateKey) privateKey).getModulus().bitLength()
调用时统一处理
业务代码中直接使用该方法,异常自然传播:
- 避免静默吞掉异常或只打印日志
- 上层可捕获
InvalidPrivateKeyException做针对性处理(如拒绝请求、记录审计日志) - 不要依赖异常类型判断逻辑(如用
instanceof检查InvalidKeySpecException),应统一用自定义异常封装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










