OpenSSL stellt libcrypto und libssl für C und über Bindings für Node.js, Python, PHP und Ruby bereit, dazu den Befehl openssl, dem die meisten zuerst begegnen. Die Fakten auf dieser Seite wurden mit dem Distributionspaket aus Alpine 3.24.2 geprüft, OpenSSL 3.5.9 (die Linie 3.5 mit Langzeitunterstützung); die neuesten Upstream-Releases waren damals 3.6.5 und 4.0.3, dort kann das Verhalten also abweichen.
ECDSA-Signaturen aus EVP_DigestSign und aus openssl dgst -sign sind ASN.1-DER – auf P-256 70 bis 72 Byte. Nonces sind zufällig, sofern du den Parameter nonce-type nicht auf 1 setzt (OpenSSL 3.2+); damit wurde der P-256-Testvektor aus RFC 6979 reproduziert. Auf der Befehlszeile ist dieser Parameter nur über pkeyutl erreichbar, wie das Beispiel zeigt. s wird nicht normalisiert, und die Prüfung akzeptiert High-S. EVP_PKEY_sign signiert einen Digest, den du selbst berechnet hast.
Fehlerhafte Eingabe ist ein Fehler, kein negatives Prüfergebnis: EVP_DigestVerify gab für eine rohe r‖s-Signatur mit 64 Byte -1 zurück, und die CLI meldete das auch. openssl dgst -verify gab für eine korrekte Signatur Verified OK aus, für eine gültige Signatur über andere Daten Verification failure und für 64 Byte, die kein DER sind, Error verifying data – in 3.5.9 lässt sich ein Formatproblem also am Wortlaut von einer Fälschung unterscheiden. Konvertiere rohe Signaturen mit dem Konverter DER ⇄ Raw oder lass den OpenSSL-Befehls-Builder den richtigen Aufruf zusammenstellen.
Die Kurven umfassen P-224 bis P-521, secp256k1 und die Brainpool-r1-Kurven, dazu Ed25519 und Ed448. Seit 3.5 implementiert der Standard-Provider außerdem ML-KEM, ML-DSA und SLH-DSA sowie die hybride TLS-Gruppe X25519MLKEM768. Schlüssel liegen als private Schlüssel in PKCS#8 (unverschlüsselt oder verschlüsselt) oder SEC1 vor und als öffentliche Schlüssel in SPKI oder in Zertifikaten: genpkey schreibt -----BEGIN PRIVATE KEY-----, der ältere Befehl openssl ec schreibt -----BEGIN EC PRIVATE KEY----- – eine Datei mit der Kennzeichnung EC ist immer ein privater Schlüssel.
Die meisten Fehlermeldungen, nach denen gesucht wird, entstehen beim Laden von Schlüsseln – no start line, header too long, unsupported vom Decoder – und werden auf den verlinkten Fehlerseiten behandelt.