Как создать jwt токен и подписать его приватным сертификатом по алгоритму RSA?
Перепробывал кучу вариантов из гугла, ничего не работает. Пока остановился на таком, он как мне кажется, наиболее близок к истине
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 нужен для апи-запросов к стороннему сервису.
Ответы:
ключ как то странно создается.
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 подписать.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для создания 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. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.