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

