dgst openssl digital-signature

Diferencia entre openSSL rsautl y dgst



openssl verify signature (2)

El siguiente comando genera una firma para un archivo de entrada:

openssl dgst -sha1 -sign privateKey.pem -out signature1 someInputFile

Los siguientes comandos también generan una firma para un archivo de entrada:

openssl dgst -binary -sha1 someInputFile > digest openssl rsautl -sign -in digest -inkey privateKey.pem -out signature2

Que yo sepa, ambos deben crear la firma RSA de un resumen SHA1 del archivo. Pero no generan la misma firma.

Como resultado, la firma generada con el método 2 tampoco puede ser verificada por una llamada openssl dgst -verify .

¿Alguien sabe cuál es la diferencia y cómo puede superarse?



La respuesta simple es que dgst -sign crea un hash, ASN1 lo codifica y luego firma el hash codificado ASN1, mientras que rsautl -sign solo firma la entrada sin hashing o codificación ASN1. Ambos métodos incluyen los datos de entrada en la salida, junto con la firma, en lugar de producir solo una firma como salida. Aquí hay un script Bash que muestra la diferencia entre openssl dgst -sign y openssl rsautl -sign .

#!/bin/bash # @(#) Bash script demos difference between openssl rsautl and dgst signing # Usage: $0 <name of file to sign> <private key file, without passphrase> # 1. Make an ASN1 config file cat >asn1.conf <<EOF asn1 = SEQUENCE:digest_info_and_digest [digest_info_and_digest] dinfo = SEQUENCE:digest_info digest = FORMAT:HEX,OCT:`openssl dgst -sha256 $1 |cut -f 2 -d '' ''` [digest_info] algid = OID:2.16.840.1.101.3.4.2.1 params = NULL EOF # If you are wondering what the "algid = OID:2.16.840.1.101.3.4.2.1" is, it''s # the SHA256 OID, see http://oid-info.com/get/2.16.840.1.101.3.4.2.1 # 2. Make a DER encoded ASN1 structure that contains the hash and # the hash type openssl asn1parse -i -genconf asn1.conf -out $1.dgst.asn1 # 3. Make a signature file that contains both the ASN1 structure and # its signature openssl rsautl -sign -in $1.dgst.asn1 -inkey $2 -out $1.sig.rsa # 4. Verify the signature that we just made and ouput the ASN structure openssl rsautl -verify -in $1.sig.rsa -inkey $2 -out $1.dgst.asn1_v # 5. Verify that the output from the signature matches the original # ASN1 structure diff $1.dgst.asn1 $1.dgst.asn1_v # 6. Do the equivalent of steps 1-5 above in one "dgst" command openssl dgst -sha256 -sign $2 -out $1.sig.rsa_dgst $1 # 7. Verify that the signature file produced from the rsautl and the dgst # are identical diff $1.sig.rsa $1.sig.rsa_dgst

Ver mi comentario anterior al OP para los créditos.