【发布时间】:2022-07-08 20:30:37
【问题描述】:
我有一个集成,我在其中验证由另一个服务创建的 JSON。它们提供了一个公共端点来获取公共证书以进行验证。
但我正在为此设置一个测试,并希望使用 Nimbus 创建相同的 JWT 以使用我自己的私钥对其进行签名。所以我这样做(它是一个嵌套和加密的 JWT): https://connect2id.com/products/nimbus-jose-jwt/examples/signed-and-encrypted-jwt
然后我想在测试中使用 MockServer (https://www.mock-server.com/) 端点模拟公共端点。问题是我尝试从如下示例中的 senderJWK 的公钥创建 PEM 证书:
var encoded = senderJWK.toPublicKey().getEncoded();
var base64Encoded = Base64.getEncoder().encode(encoded);
return new String(base64Encoded, StandardCharsets.UTF_8);
(我也测试过senderJWK.toRSAPublicKey().getEncoded()。)
适用于真实证书的代码无法解析它。解析它的代码如下所示:
private static RSAPublicKey readPublicKey(String publicKey) throws CertificateException {
var bytes = Base64.getDecoder().decode(publicKey);
var inStream = new ByteArrayInputStream(bytes);
var certificateFactory = CertificateFactory.getInstance(X_509_CERTIFICATE_FACTORY);
var certificate = (X509Certificate) certificateFactory.generateCertificate(inStream);
return (RSAPublicKey) certificate.getPublicKey();
}
我得到的错误是:
java.io.IOException: Too short
at java.base/sun.security.util.DerValue.<init>(DerValue.java:333)
at java.base/sun.security.util.DerInputStream.getDerValue(DerInputStream.java:109)
at java.base/sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1771)
at java.base/sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:183)
... 100 common frames omitted
Wrapped by: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: Too short
at java.base/sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:186)
at java.base/sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:105)
at java.base/java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:355)
... 95 common frames omitted
【问题讨论】:
-
PEM 不只是 base64 并且您的目标代码不是在读取 PEM 证书,而是在读取 base64 证书。但正如您所说,您的实际问题是公钥不是任何类型的证书(二进制/DER、base64 或 PEM)。
标签: java jwt certificate public-key-encryption der