【问题标题】:JWT[ RSA ], api owner shared private keyJWT[ RSA ],api 所有者共享私钥
【发布时间】:2020-08-01 15:08:35
【问题描述】:

所以我必须为我们正在与我们的一个客户进行的集成编写一个 Rest 客户端。

他们给了我们一个私钥并告诉我们创建一个 json 有效负载的 JWT。 关键:

"-----BEGIN RSA PRIVATE KEY-----\nYYYYYYYYYYYYYYYYYYYYYYYYYYYYY edited ..YYYYY==\n---

--END RSA PRIVATE KEY-----\n"

问题: 共享私钥是否正确,有没有我可以使用 RSA 创建 JWT 的 java 示例?

礼貌 - https://wstutorial.com/misc/jwt-java-public-key-rsa.html

public String generateJwtToken(PrivateKey privateKey) {
        String token = Jwts.builder().setSubject("adam")
                .setExpiration(new Date(2018, 1, 1))
                .setIssuer("info@wstutorial.com")
                .claim("groups", new String[] { "user", "admin" })
                // RS256 with privateKey
                .signWith(SignatureAlgorithm.RS256, privateKey).compact();
        return token;
    }

【问题讨论】:

    标签: java jwt rsa


    【解决方案1】:

    不,共享私钥是不正确的。绝不。 它被称为 private 是有原因的。

    在客户端创建令牌也是不正确的。

    这里唯一正确的是,您需要私钥来签署令牌,但这不是客户端的任务。它违背了 JWT 的全部目的,因为您可以随心所欲地写入它(例如角色、到期时间)。似乎 API 所有者信任您,并且可能是一个不公开的 API,但无论如何,我建议以正确的方式进行操作。他们应该实现一个端点来请求一个令牌。

    用法示例通常可以在jwt libraries的网站上找到。

    【讨论】:

      【解决方案2】:

      RSA 密钥是公钥/私钥对。私钥可用于签署 JWT,公钥可用于验证这些 JWT 的签名。

      私钥不应与任何人共享。这样做会允许随机的人访问您的客户端 API。

      我在使用 Nimbus 与 RSA 签署 JWT 方面有很好的经验。您可以在此处查看一些示例:https://connect2id.com/products/nimbus-jose-jwt/examples/jwt-with-rsa-signature

      【讨论】:

        【解决方案3】:

        迟到总比没有好

        共享私钥通常是个坏主意。但我们假设您拥有私钥,并且您希望每次都使用它来生成一个密钥对。

        这里是一个如何使用现有私钥的示例,该私钥存储在 P12 文件中。

        @Test
        public void readP12() {
            char[] keyStorePassword = "1234567890".toCharArray();
            try {
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                InputStream keyStoreData = new FileInputStream(LOCATION + "\\keystore.p12");
                keyStore.load(keyStoreData, keyStorePassword);
        
                KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyStorePassword);
                KeyStore.Entry keyEntry = keyStore.getEntry("1", entryPassword);
        
                KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)
                        keyStore.getEntry("1", entryPassword);
                PrivateKey privateKey = privateKeyEntry.getPrivateKey();
                PublicKey publicKey = privateKeyEntry.getCertificate().getPublicKey();
        
                String token = generateJwtToken(privateKey);
                System.out.println(token);
                printStructure(token, publicKey);
            } catch (Exception e) {
              // tbd
            }
        }
        

        你可以看到如何save private key in p12 file

        【讨论】:

          猜你喜欢
          • 2017-05-11
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多