OpenSSL fournit libcrypto et libssl pour C et, via des liaisons, pour Node.js, Python, PHP et Ruby, ainsi que la commande openssl, celle que la plupart des gens rencontrent en premier. Les faits présentés ici ont été vérifiés sur le paquet de distribution Alpine 3.24.2, OpenSSL 3.5.9 (la branche 3.5 à support long terme) ; les versions amont les plus récentes à ce moment-là étaient la 3.6.5 et la 4.0.3, dont le comportement peut donc différer.
Les signatures ECDSA produites par EVP_DigestSign et par openssl dgst -sign sont en ASN.1 DER, de 70 à 72 octets sur P-256. Les nonces sont aléatoires, sauf si vous réglez le paramètre nonce-type sur 1 (OpenSSL 3.2+), ce qui a reproduit le vecteur de test P-256 de la RFC 6979 ; en ligne de commande, ce paramètre n’est accessible que via pkeyutl, comme le montre l’exemple. s n’est pas normalisé et la vérification accepte high-S. EVP_PKEY_sign signe un condensat que vous avez calculé.
Une entrée mal formée produit une erreur, pas un résultat négatif : EVP_DigestVerify a renvoyé -1 pour une signature r‖s brute de 64 octets, et la CLI l’a signalé. openssl dgst -verify a affiché Verified OK pour une bonne signature, Verification failure pour une signature valide portant sur d’autres données et Error verifying data pour 64 octets qui ne sont pas du DER : dans la 3.5.9, le libellé permet donc de distinguer un problème de format d’une falsification. Convertissez les signatures brutes avec le convertisseur DER ⇄ brut, ou laissez le générateur de commandes OpenSSL assembler la bonne invocation.
Les courbes prises en charge vont de P-224 à P-521 et comprennent secp256k1 et les courbes Brainpool r1, ainsi qu’Ed25519 et Ed448. Depuis la 3.5, le fournisseur par défaut implémente aussi ML-KEM, ML-DSA et SLH-DSA, ainsi que le groupe hybride TLS X25519MLKEM768. Les clés se présentent comme clés privées PKCS#8 (en clair ou chiffrées) ou SEC1, et comme clés publiques SPKI ou de certificat : genpkey écrit -----BEGIN PRIVATE KEY-----, l’ancien openssl ec écrit -----BEGIN EC PRIVATE KEY----- ; un fichier dont l’étiquette contient EC est toujours une clé privée.
La plupart des messages d’erreur que les développeurs recherchent viennent du chargement des clés (no start line, header too long, unsupported venant du décodeur) et sont traités dans les pages d’erreur en lien.