У меня есть закрытый и открытый ключ .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 закрытый и открытый ключ.