【问题标题】:Create PEM certificate from Java PublicKey created with Nimbus从使用 Nimbus 创建的 Java PublicKey 创建 PEM 证书
【发布时间】: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


【解决方案1】:

好的,我想我需要做的是从 java 创建一个 X509 证书,然后在签名和验证中使用其中的私钥和公钥。

找到了这些关于如何使用充气城堡来做到这一点的资源: Self signed X509 Certificate with Bouncy Castle in Java How to create a X509 certificate using Java?

编辑:我得到它的工作正常。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2013-07-05
    • 2020-03-06
    相关资源
    最近更新 更多