Une signature JWS est la concaténation des deux entiers big-endian de 32 octets r et s, encodée en base64url (86 caractères). Signer avec OpenSSL, le SHA256withECDSA par défaut de Java, ecdsa.SignASN1 de Go ou le crypto.sign() par défaut de Node produit du DER à la place, que les vérificateurs rejettent : demandez une sortie au format IEEE P1363 ou convertissez la signature. La clé est une JWK EC avec crv P-256.
ES256 est l’algorithme par défaut des clés d’accès (COSE −7), des preuves DPoP, des jetons d’App Store Connect et des jetons de fournisseur APNs d’Apple, ainsi que de nombreux fournisseurs d’identité modernes, car P-256 est pris en charge par WebCrypto dans les navigateurs, par la Secure Enclave, par les TPM et par les KMS cloud. La signature est rapide (environ 87 000 signatures par seconde avec OpenSSL 3.6.5 sur un cœur d’Apple M4 Max) et les jetons sont plus courts d’environ 250 caractères que les jetons RS256 à clés de 2048 bits.
Une leçon cuisante de 2022 : de Java 15 à Java 18, une signature ECDSA entièrement nulle était acceptée pour n’importe quel message et n’importe quelle clé (CVE-2022-21449, « Psychic Signatures »), si bien que des JWT ES256 falsifiés passaient la vérification. Maintenez vos environnements d’exécution à jour et assurez-vous que les vérificateurs rejettent tout r ou s hors de l’intervalle 1…n−1.