JWT[ RSA ], api 所有者共享私钥

JWT[ RSA ], api owner shared private key

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

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

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

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

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

礼貌 - 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;
    }

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

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

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

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

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

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

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

迟到总比不到好

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

这里是一个如何使用存储在 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