Mit DSA kann nicht signiert werden

543
Sean Walsh

Ein DSA-Schlüssel wird erstellt mit:

openssl genpkey -genparam -algorithm DSA -out dsaparams.pem -pkeyopt dsa_paramgen_bits:1024  openssl genpkey -paramfile dsaparams.pem -out dsakey.pem 

Wenn ich versuche zu unterschreiben, wird diese Fehlermeldung angezeigt:

echo 'bacon' > text  openssl pkeyutl -sign -in text -inkey dsakey.pem -out sig Public Key operation error 

Es ist möglich, openssl dgst -signmit den obigen Befehlen zu signieren, jedoch nicht.

Warum passiert das? Das man openssl-pkeyutlsagt, DSA erlaubt Unterschrift und Verifizierung. Ich verwende OpenSSL 1.1.0g

0
https://serverfault.com/questions/219818/creating-a-dsa-signature-von-the-linux-command-line vor 5 Jahren 1

1 Antwort auf die Frage

1
fgrieu

TLDR: Es ist anscheinend openssl pkeyutldafü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):

  1. openssl pkeyutlEs 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 von openssl pkeyutl Bark schö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.

  2. 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.

  3. 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 dgstdem Hash-Then-Sign geschehen kann, wenn openssl pkeyutldies 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 -sha256habe 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 sein sha1, sha224oder sha256. Wenn gesetzt, stimmt die Anzahl der Bits in q mit der Ausgabegröße des angegebenen Digests überein und der dsa_paramgen_q_bitsParameter wird ignoriert (..).

Selbst bei '3072' wird der Text oder der Hash in 'sha256' nicht signiert vor 5 Jahren 0
Vielen Dank. Die Verwendung von `openssl dgst -sign` funktioniert mit RSA und DSA, aber ich bezweifle immer noch, warum der Befehl` openssl pkeyutl` nicht signiert. vor 5 Jahren 0