Правильное создание сертификатов для JWT в Java

Я пытаюсь использовать простой пример, приведенный здесь:

https://github.com/auth0/java-jwt

//HMAC
Algorithm algorithmHS = Algorithm.HMAC256("secret");

//RSA
RSAPublicKey publicKey = //Get the key instance
RSAPrivateKey privateKey = //Get the key instance
Algorithm algorithmRS = Algorithm.RSA256(publicKey, privateKey);

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

  1. Я следил за Как создать открытый и закрытый ключ с помощью openssl? для генерации открытого и закрытого ключа.
  2. Я преобразовал закрытый ключ в форму DER openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out pkcs8.der -nocrypt
  3. Теперь я могу загрузить закрытый ключ как:

    val privateKey = readKeyAsBytes("pkcs8.der")
            .run { PKCS8EncodedKeySpec(this) }
            .run { KeyFactory.getInstance("RSA").generatePrivate(this) }
            as RSAPrivateKey
    
  4. Однако это не работает для создания открытого ключа:

    val publicKey = readKeyAsBytes("publickey.crt")
            .run { X509EncodedKeySpec(this) }
            .run { KeyFactory.getInstance("RSA").generatePublic(this) }
            as RSAPublicKey
    

так как это не удается с InvalidKeyException: invalid key format. Я не уверен, правильно ли здесь .getInstnace(RSA), но я не смог заставить его работать ни с чем другим. Я предполагаю, что открытый ключ не в формате X509, но мне не удается преобразовать его в него.


person Vojtěch    schedule 06.01.2020    source источник


Ответы (1)


Вы говорите, что преобразовали файл закрытого ключа 'private_key.pem' в формат DER, но преобразовали ли вы также открытый ключ в формат DER.

Функция readKeyAsBytes ожидает двоичные данные.

DER расшифровывается как Distinguished Encoding rules; это бинарный формат. PEM — это просто представление двоичных данных DER в кодировке base64 с заголовком до и нижним колонтитулом после. Но это текст ascii, а не двоичный.

Если вы откроете файлы в текстовом редакторе, файл DER будет кучей сумасшедших нечитаемых вещей.

Файлы PEM будут выглядеть примерно так:

-----BEGIN CERTIFICATE----- 
MIIGuzCCBaOgAwIBAgIUT2q/veSq2N3hq+1QSqfrZo6SW8IwDQYJKoZIhvcNAQEL 
...
Wu/svFTqcFBje8FiO98kFwJwSuajwt9l2mToy7W7PkQ+WARIOLR/7pcNh27O99Y=
-----END CERTIFICATE-----

Удачи

person Mark Arnott    schedule 09.01.2020