当前位置: 首页 > 知识库问答 >
问题:

生成并读取 base64 私钥以从 java 对 JWT 令牌进行签名

阙项禹
2023-03-14

1-从命令行生成私钥:

OpenSSL Genrsa -AES256 -OUT PRIVATE.key 2048

Java中,阅读它:

String privateKey = IOUtils.toString(TestJwtSecurityUtil.class.getResourceAsStream("/private.key"));
privateKey = privateKey.replace("-----BEGIN RSA PRIVATE KEY-----", "");
privateKey = privateKey.replace("-----END RSA PRIVATE KEY-----", "");
privateKey = privateKey.replaceAll("\\s+","");

byte[] encodedKey = DatatypeConverter.parseBase64Binary( privateKey );


PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedKey);

KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pKey = kf.generatePrivate(keySpec); // fails

出现异常:

线程“main”中的异常 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=58, 太大了.

我试图转换为base64:

byte[] encodedKey = DatatypeConverter.parseBase64Binary( encodedString );
 PrivateKey pKey = kf.generatePrivate(keySpec); // fails

有:

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
    at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:251)

问:如何通过这个?为了使私钥被读取,以便最终我可以唱JWT令牌:

final JwtBuilder builder = Jwts.builder().setId("id1")
                ....
                .signWith(signatureAlgorithm, pKey);

共有1个答案

锺星腾
2023-03-14

是的,它是重复的。但是因为我花了 1 个多小时在 SO 站点中寻找它。基于这个回复,以及充气城堡的PEMParser。谢谢,@dave_thompson_085

>

  • 要创建私钥:

    • OpenSSL Genrsa -out Private .key 4096
    • openssl rsa -pubout -in private.key -out public.key

    然后从爪哇

    --

             final PrivateKey pKey = getPrivateKey();
    
             final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.RS256; // private key to sign / public to confrim a sign
         final JwtBuilder builder = Jwts.builder().setId("id1")
                        .setIssuedAt(now)
                        .setSubject(subject)
                        .setIssuer(issuer)
                        .setAudience("api")
                        .addClaims(Map.of(
                                "user_name", "test user",
                                "authorities", List.of("ROLE_USER"),
                                "scope", List.of("read", "write"),
                                "client_id", "test-client"
                                )
                        )                     .signWith(signatureAlgorithm, pKey);
    
    String jwt = builder.compact();
    

    哪里:

    private static PrivateKey getPrivateKey() throws Exception {
    
            val path = TestUtils.class.getResource("/").getPath();
    
            final PEMParser pemParser = new PEMParser(new FileReader(path + "/private.key"));
            final JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
            final PEMKeyPair object = (PEMKeyPair) pemParser.readObject();
            final KeyPair kp = converter.getKeyPair(object);
            final PrivateKey pKey = kp.getPrivate();
    
            return pKey;
        }
    

    然后检查,粘贴:生成的 jwt 到 https://jwt.io/(或任何其他工具)以查看/检查内容。

    在那里放置一个公开.key内容以检查签名。看到一切都是绿色的。

  •  类似资料:
    • 我试图测试我正在构建的一个关于JWT的软件的功能,以了解它,它使用Firebase JWT PHP包 我正在尝试创建一个使用密钥对作为编码/解码的测试用例,但无法获得http://jwt.io页面以使用我的密钥创建令牌。 这些是我使用命令创建的密钥,没有任何修改。 我转到页面,选择HS256/384/512并删除页面默认设置的键。然后我粘贴我的私钥以便对我的数据进行签名。但是,该页面不会生成任何J

    • 后端服务器有一个endpoint,在ping时提供JSON响应,并受Apigee边缘代理的保护。目前,该endpoint没有安全性,我们希望为发出请求的所有客户端实现仅承载令牌身份验证。所有向API发出请求的客户端都将在授权承载中发送JWT令牌,Apigee Edge将用于验证JWT令牌。 我如何使用keydape生成这个JWT令牌? 此外,Apigee还需要一个JWT令牌来源的公钥(签署JWT令

    • 我有一个由多个客户端访问的JWT实现。从某种意义上说,多个客户端正在向我发送JWT令牌,他们正在使用我在他们之间共享的RSA公钥创建JWT令牌。我正在使用RSA私钥解码JWT令牌。 但现在由于一些安全原因,我需要向他们发送不同的公钥,并获得JWT令牌,然后使用我拥有的一个私钥对其进行解码。 简而言之,我将如何生成多个公钥和单个私钥或任何类似的方法。

    • 鉴于: 由RSACryptoServiceProvider生成的签名密钥。 创建带有孩子的签名jwt的需求。 如果签名密钥来自x509证书,那么我会将kid设置为x5t。在这种情况下,情况并非如此。我可以为孩子编造一些武断的东西,但是如果碰撞不太可能发生,并且孩子和证书之间存在有意义的联系,那就最好了。 我的意图是:- 创建一个字节数组,通过将模字节附加到指数字节来创建。 SHA256编码数组。

    • 我正在使用jose-jwt库,并希望使用RS256加密算法在C#中创建一个有签名的JWT。我对密码学没有经验,所以请原谅我的无知。我在文档中看到以下示例: 它显示了文件的使用,但是如何使用下面表单的RSA密钥文件呢?我正在查看X509Certificate2的文档,但我看不到RSA私钥的选项。它似乎只接受,我认为这是公钥。 最后,文档中列出的两个选项之间的区别是什么?我如何在这两个选项之间进行选择

    • 我有一个私钥文件(PEM BASE64编码)。我想用它来解密一些其他数据。使用Java我试着读取文件并解码其中的BASE64编码数据。这是我尝试的代码片段.... 我得到以下错误 类似的问题已经贴在这里,但那些对我没有用。几乎所有的人都建议使用Bouncycastle provider,而Bouncycastle provider并不愿意使用FIPS兼容的provider,并且不确定BC prov

    • 我需要与GitHub集成API进行交互,但具体是从。NET 4.0,所以我不能使用Octokit。 基本上,我得到了一个格式化的私有rsa密钥(标准不支持。NET API),并且必须发送RS256 jwt令牌才能获得与API交互的身份验证令牌。 提供了以下ruby示例代码: 使用下面的curl示例 以及以下Result示例: