Как создать jwt токен и подписать его приватным сертификатом по алгоритму RSA?

Ссылка скопирована
1 ответ

Перепробывал кучу вариантов из гугла, ничего не работает. Пока остановился на таком, он как мне кажется, наиболее близок к истине

val keyFactory = KeyFactory.getInstance("RSA")         val keyBytes: ByteArray = Base64.getDecoder().decode(privateKey)         val pkcs8EncodedKeySpec = PKCS8EncodedKeySpec(keyBytes)         val prvKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec)          val jwt = Jwts.builder()             .setHeaderParams(headers)             .setClaims(claims)             .signWith(prvKey, SignatureAlgorithm.RS256)             .compact()          println(jwt)

val keyFactory = KeyFactory.getInstance("RSA") val keyBytes: ByteArray = Base64.getDecoder().decode(privateKey) val pkcs8EncodedKeySpec = PKCS8EncodedKeySpec(keyBytes) val prvKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) val jwt = Jwts.builder() .setHeaderParams(headers) .setClaims(claims) .signWith(prvKey, SignatureAlgorithm.RS256) .compact() println(jwt)

Однако при запуске получаю такую вот ошибку

java.io.IOException: extra data at the end 	at java.base/sun.security.util.DerValue.<init>(DerValue.java:432) ~[na:na] 	at java.base/sun.security.util.DerValue.<init>(DerValue.java:344) ~[na:na] 	at java.base/sun.security.pkcs.PKCS8Key.<init>(PKCS8Key.java:96) ~[na:na] 	at java.base/sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:162) ~[na:na] 	at java.base/sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:92) ~[na:na] 	at java.base/sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:348) ~[na:na] 	at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:249) ~[na:na] 	at java.base/java.security.KeyFactory.generatePrivate(KeyFactory.java:389) ~[na:na]

java.io.IOException: extra data at the end at java.base/sun.security.util.DerValue.<init>(DerValue.java:432) ~[na:na] at java.base/sun.security.util.DerValue.<init>(DerValue.java:344) ~[na:na] at java.base/sun.security.pkcs.PKCS8Key.<init>(PKCS8Key.java:96) ~[na:na] at java.base/sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:162) ~[na:na] at java.base/sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:92) ~[na:na] at java.base/sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:348) ~[na:na] at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:249) ~[na:na] at java.base/java.security.KeyFactory.generatePrivate(KeyFactory.java:389) ~[na:na]

Нагуглить что-то внятное об ошибке мне тоже не удалось.

Приватный ключ у меня хранится в БД в виде base64 строки.

Есть идеи, как побороть эту ошибку? Или есть какой-либо другой код, при котором эта ошибка не возникает?

Дополнительно:

во первых у вас до JWT дело не доходит

во вторых работать с JWT сложно и даже очень сложно

поясните пожалуйста чего желаете добиться

я могу посоветовать более простые решения но не уверен что понимаю какую задачу вы пытаетесь решить

  • сергей кузьмин, то, что до jwt дело не доходит, я вижу, просто объясняю контекст, зачем это надо.

    Сам jwt нужен для апи-запросов к стороннему сервису.

  • Ответы:

    ключ как то странно создается.

    private static KeyPair generateKeyPair() throws NoSuchAlgorithmException {         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");         keyPairGenerator.initialize(2048); // Размер ключа         return keyPairGenerator.generateKeyPair();     }

    private static KeyPair generateKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); // Размер ключа return keyPairGenerator.generateKeyPair(); }

    попробуйте так

    • Ключ у меня уже есть, он выдан сторонним сервисом, мне им надо jwt подписать.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ольга Сеть Ответ

    Для создания JWT токена и подписи его приватным сертификатом по алгоритму RSA вам потребуется использовать библиотеку, поддерживающую работу с JWT и RSA. В примере ниже я использовал библиотеку php-jwt для работы с JWT и phpseclib для работы с RSA.

    Прежде всего, установите библиотеки через Composer, добавив их в файл composer.json:

    ```json
    {
    "require": {
    "firebase/php-jwt": "^5.2",
    "phpseclib/phpseclib": "^3.0"
    }
    }
    ```

    После установки библиотек создайте приватный и публичный ключи RSA, если у вас их еще нет. Приватный ключ должен быть храниться в безопасном месте, например, в файле за пределами директории веб-сервера.

    Создание JWT токена и подпись его приватным ключом по алгоритму RSA можно сделать следующим образом:

    ```php
    '1234567890',
    'name' => 'John Doe',
    'admin' => true
    ];

    $token = JWT::encode($tokenData, $privateKey, 'RS256');

    echo "JWT Token: " . $token;
    ```

    В этом примере мы загружаем приватный ключ из файла, создаем массив данных для токена и подписываем его с помощью функции `JWT::encode()` с указанием алгоритма подписи 'RS256'.

    После выполнения этого кода у вас будет сгенерирован и выведен JWT токен, подписанный приватным ключом по алгоритму RSA. Важно помнить, что приватный ключ должен храниться в безопасном месте и не должен быть доступен посторонним лицам.

    Надеюсь, этот ответ поможет вам создать JWT токен и подписать его приватным сертификатом по алгоритму RSA. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно