Конвертер ключів JWK ⇄ PEM
Конвертуйте криптографічні ключі між форматами JWK і PEM через справжній Web Crypto API, розшифруйте алгоритм/криву/розмір і обчисліть відбиток JWK за RFC 7638.
Результат
JSON Web Keys (JWK) і ключі в кодуванні PEM зустрічаються поперемінно в бібліотеках JWT, TLS-інструментах і конфігурації OAuth/OIDC, але конвертація між ними вручну означає декодування структур DER з base64 чи переформатування JSON — легко припуститися непомітної помилки. Цей інструмент виконує конвертацію через справжній Web Crypto API браузера, а не маніпуляції з текстом: вставлений блок PEM імпортується через crypto.subtle.importKey('spki'|'pkcs8', ...) і повторно експортується як JWK через exportKey('jwk', ...); вставлений JWK імпортується через importKey('jwk', ...) і повторно експортується як DER SPKI чи PKCS8, потім обгортається у правильний заголовок PEM. Оскільки сам браузер перевіряє й декодує матеріал ключа, пошкоджений ключ чи невідповідний вибір алгоритму гучно провалюється замість того, щоб мовчки видати сміття.
Підтримувані алгоритми — RSA (RSASSA-PKCS1-v1_5), EC на кривих P-256/P-384/P-521 і, де браузер їх реалізує, Ed25519 та X25519. Підтримка Ed25519/X25519 у Web Crypto все ще непослідовна між рушіями, тож замість вгадування за рядком user agent інструмент виконує справжню перевірку через crypto.subtle.generateKey() для обраної кривої й прямо повідомляє, якщо тут це не підтримується, а не повертає вигаданий результат.
Кожна конвертація також розшифровує реальні метадані ключа: для ключів RSA — довжину модуля в бітах та алгоритм хешування напряму з об'єкта CryptoKey; для ключів EC та OKP — назву кривої; а для кожного ключа — відбиток JWK за RFC 7638 — хеш SHA-256 обов'язкових полів JWK, серіалізованих у строгому лексикографічному порядку (e/kty/n для RSA, crv/kty/x/y для EC, crv/kty/x для OKP/Ed25519/X25519). Цей відбиток багато систем використовують як ідентифікатор ключа «kid», і помилка в порядку полів дає зовсім інший хеш — саме таку помилку схильна допускати саморобна реалізація.
Оскільки все виконується через crypto.subtle у вашій власній вкладці браузера, матеріал приватного ключа ніколи не покидає ваш пристрій — немає ні сервера, ні завантаження, ні жодного зовнішнього виклику API на будь-якому етапі конвертації.