Подпись JWS — это два 32-байтных целых числа r и s в порядке big-endian, записанные подряд и закодированные в base64url (86 символов). При подписании через OpenSSL, SHA256withECDSA в Java, ecdsa.SignASN1 в Go или crypto.sign() в Node с настройками по умолчанию получается DER, и проверяющие стороны такую подпись отклоняют; запросите вывод в формате IEEE P1363 или преобразуйте подпись. Ключ — EC JWK с crv P-256.
ES256 используется по умолчанию для ключей доступа (COSE −7), доказательств DPoP, токенов App Store Connect и токенов провайдера APNs от Apple, а также у многих современных поставщиков удостоверений, потому что P-256 поддерживают WebCrypto в браузерах, Secure Enclave, TPM и облачные KMS. Подписание быстрое (около 87 000 подписей в секунду с OpenSSL 3.6.5 на одном ядре Apple M4 Max), а токены примерно на 250 символов короче токенов RS256 с 2048-битными ключами.
Болезненный урок 2022 года: Java версий 15–18 принимала подпись ECDSA из одних нулей для любого сообщения и ключа (CVE-2022-21449, «Psychic Signatures»), поэтому поддельные JWT с ES256 проходили проверку. Своевременно обновляйте среду выполнения и убедитесь, что проверяющая сторона отклоняет r или s вне диапазона 1…n−1.