Как закодировать jwtToken из es256 pem файлов java - PullRequest
0 голосов
/ 16 января 2019

У меня есть закрытый и открытый ключ .pem файлы, созданные в алгоритме ES256.Я хочу подписать токен JWT закрытым ключом, который позже смогу проверить открытым ключом.

On jwt.io Я обнаружил, что есть несколько библиотек, поддерживающих ES256: jose4j, nimbus-jose-jwt, jjwt, fusionauth-jwt, vertx-auth-jwt.К сожалению, я не могу найти примеры загрузки ключей из файла pem и создания токена JWT.

Пример N1:

Я импортировал файл pem в .keystore с помощью

openssl pkcs12 -export -in ES256-public-key.pem -inkey ES256-private-key.pem -out ~/keystore.p12 -name selfsigned -nocerts

Я пробовал jose4j со следующим кодом:

KeyStore store = KeyStore.getInstance("PKCS12");

store.load(new FileInputStream("/home/andrew/keystore.p12"), "test".toCharArray());
Key key = store.getKey("selfsigned", "test".toCharArray());

JsonWebEncryption jwe = new JsonWebEncryption();
jwe.setPayload("Hello World!");
jwe.setAlgorithmHeaderValue(KeyManagementAlgorithmIdentifiers.ECDH_ES_A256KW);
jwe.setEncryptionMethodHeaderParameter(ContentEncryptionAlgorithmIdentifiers.AES_128_CBC_HMAC_SHA_256);
jwe.setKey(key);
String serializedJwe = jwe.getCompactSerialization();
System.out.println("Serialized Encrypted JWE: " + serializedJwe);
jwe = new JsonWebEncryption();
jwe.setAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST,
    KeyManagementAlgorithmIdentifiers.ECDH_ES_A256KW));
jwe.setContentEncryptionAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST,
    ContentEncryptionAlgorithmIdentifiers.AES_128_CBC_HMAC_SHA_256));
jwe.setKey(key);
jwe.setCompactSerialization(serializedJwe);
System.out.println("Payload: " + jwe.getPayload());

Выдает исключение:

Exception in thread "main" org.jose4j.lang.InvalidKeyException: Invalid key java.lang.ClassCastException: Cannot cast sun.security.ec.ECPrivateKeyImpl to java.security.interfaces.ECPublicKey
    at org.jose4j.jwx.KeyValidationSupport.castKey(KeyValidationSupport.java:64)
    at org.jose4j.jwe.EcdhKeyAgreementAlgorithm.validateEncryptionKey(EcdhKeyAgreementAlgorithm.java:188)
    at org.jose4j.jwe.EcdhKeyAgreementWithAesKeyWrapAlgorithm.validateEncryptionKey(EcdhKeyAgreementWithAesKeyWrapAlgorithm.java:73)
    at org.jose4j.jwe.JsonWebEncryption.getCompactSerialization(JsonWebEncryption.java:264)
    at com.icthh.A.main(A.java:30)

Я даже не понимаю, почему для этого требуется открытый ключсоздать токен JWT

Пример N2

    private static void nimbus() throws IOException, JOSEException {
        JWSObject jwsObject = new JWSObject(new JWSHeader(JWSAlgorithm.ES256),
            new Payload("Hello, world!"));

// We need a 256-bit key for HS256 which must be pre-shared

        byte[] sharedKey = IOUtils.toByteArray(new FileInputStream("/home/andrew/ES256-private-key.pem"));
// Apply the HMAC to the JWS object
        jwsObject.sign(new MACSigner(sharedKey));

// Output in URL-safe format
        System.out.println(jwsObject.serialize());
    }

Этот бросок:

Exception in thread "main" com.nimbusds.jose.JOSEException: The "ES256" algorithm is not supported by the JWS signer
    at com.nimbusds.jose.JWSObject.ensureJWSSignerSupport(JWSObject.java:269)
    at com.nimbusds.jose.JWSObject.sign(JWSObject.java:318)
    at com.icthh.A.main(A.java:57)

Пример N3 :

jjwt - эта библиотека подходит для Android. Я даже не уверен, что она может подписывать токен, поскольку Android является клиентом.

Я хочу найти полный пример того, как создать подписанный токен JWT изES256 закрытый и открытый ключ.

1 Ответ

0 голосов
/ 16 января 2019

Мне удалось решить эту проблему с помощью auth0-java-jwt

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import lombok.SneakyThrows;

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.interfaces.ECPrivateKey;
import java.util.Date;


    KeyStore store = KeyStore.getInstance("PKCS12");
    //
    store.load(new FileInputStream("/home/andrew/keystore.p12"), "test".toCharArray());
    ECPrivateKey pk = (ECPrivateKey) store.getKey("selfsigned", "test".toCharArray());

    Algorithm algorithmHS = Algorithm.ECDSA256(null, pk);
    String token = JWT.create()
        .withSubject("")
        .withExpiresAt(new Date())
        .withNotBefore(new Date())
        .withIssuer("issuer")
        .withClaim("roles", "b")
        .withClaim("keys", "b")
        .sign(algorithmHS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...