TLDR: Es ist anscheinend openssl pkeyutl
dafür entworfen, einen Hash zu signieren, erhält jedoch eine kleinere Datei, in der der Hash erwartet wird. und einige in OpenSSL 1.1.0g (aber nicht in OpenSSL 1.0.2g) vorhandene Schecks stören diesen Fehler.
FWIW, als ich die Befehle der Frage mit OpenSSL 1.0.2g ausprobiert habe, ist kein Fehler aufgetreten. Ich sehe jedoch 3 Gründe, warum es versagen könnte (und zum ersten sollte):
openssl pkeyutl
Es ist dokumentiert, dass kein Hash ausgeführt wird, von dem erwartet wird, dass er extern ausgeführt wird. Meine Vermutung ist also, dass neuere Versionen vonopenssl pkeyutl
Barkschön scheitern, wenn die Eingabedatei kürzer als der Parameter q des privaten Schlüssels ist, da dies die einzige Sound-Sache ist. Das stimmt zumindest mit der Manpage überein :Bei RSA-, ECDSA- und DSA-Signaturen führt dieses Dienstprogramm kein Hashing der Eingabedaten durch, sondern verwendet die Daten direkt als Eingabe des Signaturalgorithmus. Je nach Schlüsseltyp, Signaturtyp und Auffüllmodus unterscheiden sich die maximal zulässigen Längen der Eingabedaten. Bei RSA dürfen die signierten Daten im Allgemeinen nicht länger als der Schlüsselmodul sein. Im Falle von ECDSA und DSA sollten die Daten nicht länger als die Feldgröße sein. Andernfalls werden sie still auf die Feldgröße gekürzt.
Mit anderen Worten, wenn der Wert von digest sha1 ist, sollte die Eingabe eine 20 Byte lange binäre Codierung der SHA-1-Hashfunktionsausgabe sein.
Heutzutage ist 1024-Bit-DSA zu Recht veraltet, und an einigen Stellen (einschließlich einiger SSH-Implementierungen) wurde die Unterstützung dafür kurzzeitig entfernt.
- In diesen Tagen ist SHA-1 zu Recht veraltet.
Ich würde mindestens 2048-Bit-DSA, SHA-256 und Hashing der Datei vorschlagen, bevor die Signatur berechnet wird, was am besten mit openssl dgst
dem Hash-Then-Sign geschehen kann, wenn openssl pkeyutl
dies nicht möglich ist. Ich bin kein Opensl-Guru, aber ich würde versuchen, Folgendes zu untersuchen:
# generate a private key and extract the public key openssl genpkey -paramfile dsaparams.pem -out dsaprivkey.pem openssl dsa -in dsaprivkey.pem -pubout > dsapubkey.pem # create a file "myfile" to be signed echo 'The Magic Words are Squeamish Ossifrage' > myfile # create signature "myfile.sig" openssl dgst -sha256 -sign dsaprivkey.pem myfile > myfile.sig # verify "myfile" against signature "myfile.sig" and public key openssl dgst -sha256 -verify dsapubkey.pem -signature myfile.sig myfile
Hinweis: Bei einem früheren Versuch mit openssl 1.0.2g werden Signaturen mit 160-Bit- q generiert (möglicherweise mit SHA-1). Pro Kommentar, den ich hinzugefügt -sha256
habe openssl dgst
, machte es keinen Unterschied. Experimente legen nahe, dass es notwendig ist zu verwenden -pkeyopt dsa_paramgen_q_bits:256
, obwohl dies ausdrücklich auf der Manpage heißt -pkeyopt dsa_paramgen_md:sha256
:
dsa_paramgen_md:digest
Der Digest, der bei der Parametergenerierung verwendet werden soll. Muss einer der folgenden seinsha1
,sha224
odersha256
. Wenn gesetzt, stimmt die Anzahl der Bits in q mit der Ausgabegröße des angegebenen Digests überein und derdsa_paramgen_q_bits
Parameter wird ignoriert (..).