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

使用Java JWT库时,如何创建RSAPublicKey与RSAPrivateKey实例?

从PEM文件加载RSA密钥对到RSAPublicKey/RSAPrivateKey实例

我来帮你搞定这个问题!既然已经用OpenSSL生成了PEM格式的密钥文件,咱们只需要把这些文件里的内容解析成Java的RSAPublicKey和RSAPrivateKey实例就行,完全适配你用的auth0 java-jwt库。

核心思路

PEM文件本质是Base64编码的密钥数据,加上了固定的页眉页脚。咱们需要先去掉这些页眉页脚,解码Base64得到原始的密钥字节,再用Java的KeyFactory把字节转换成对应的密钥对象。

1. 加载公钥(RSAPublicKey)

公钥的PEM格式一般是这样的:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...(Base64内容)
-----END PUBLIC KEY-----

直接用下面的方法加载:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class KeyLoader {
    public static RSAPublicKey loadPublicKey(String pemFilePath) throws Exception {
        // 读取PEM文件内容
        String pemContent = new String(Files.readAllBytes(Paths.get(pemFilePath)));
        // 去掉页眉页脚,提取Base64部分
        String publicKeyPem = pemContent
                .replace("-----BEGIN PUBLIC KEY-----", "")
                .replace("-----END PUBLIC KEY-----", "")
                .replaceAll("\\s", ""); // 去掉换行和空格

        // Base64解码
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyPem);
        // 生成公钥实例
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
        return (RSAPublicKey) keyFactory.generatePublic(keySpec);
    }
}

2. 加载私钥(RSAPrivateKey)

私钥的PEM格式常见有两种:

  • PKCS#8格式(推荐,OpenSSL默认生成的可能是这个):-----BEGIN PRIVATE KEY-----
  • PKCS#1格式:-----BEGIN RSA PRIVATE KEY-----

方案一:处理PKCS#8格式私钥(无需额外依赖)

如果你的私钥是PKCS#8格式,用这个方法:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

public class KeyLoader {
    // ... 上面的公钥方法 ...

    public static RSAPrivateKey loadPrivateKeyPKCS8(String pemFilePath) throws Exception {
        String pemContent = new String(Files.readAllBytes(Paths.get(pemFilePath)));
        String privateKeyPem = pemContent
                .replace("-----BEGIN PRIVATE KEY-----", "")
                .replace("-----END PRIVATE KEY-----", "")
                .replaceAll("\\s", "");

        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyPem);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
    }
}

方案二:处理PKCS#1格式私钥(需要BouncyCastle依赖)

如果你的私钥是PKCS#1格式,Java标准库不直接支持,需要引入BouncyCastle作为安全提供者:

首先添加Maven依赖(如果用Maven的话):

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

然后用下面的方法加载:

import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

import java.io.FileReader;
import java.nio.file.Paths;
import java.security.Security;

public class KeyLoader {
    // ... 其他方法 ...

    public static RSAPrivateKey loadPrivateKeyPKCS1(String pemFilePath) throws Exception {
        // 注册BouncyCastle提供者
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

        try (PEMParser parser = new PEMParser(new FileReader(Paths.get(pemFilePath).toFile()))) {
            Object object = parser.readObject();
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
            return (RSAPrivateKey) converter.getPrivateKey((PrivateKeyInfo) object);
        }
    }
}

3. 配合java-jwt库使用

加载完密钥后,就可以像你原来的代码那样创建Algorithm实例了:

public class JwtExample {
    public static void main(String[] args) throws Exception {
        RSAPublicKey publicKey = KeyLoader.loadPublicKey("/path/to/public.pem");
        RSAPrivateKey privateKey = KeyLoader.loadPrivateKeyPKCS8("/path/to/private.pem");

        Algorithm algorithmRS = Algorithm.RSA256(publicKey, privateKey);
        // 接下来就可以生成或验证JWT了
        String token = JWT.create()
                .withIssuer("your-issuer")
                .sign(algorithmRS);
    }
}

小提示

  • 如果不确定私钥是哪种格式,打开PEM文件看开头的页眉就行。
  • 记得处理文件读取和密钥生成时的异常(比如IOException、NoSuchAlgorithmException等),上面的示例为了简洁只抛出了Exception,实际项目里最好细化异常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:40:07