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?
El primero crea una firma . El segundo encripta el hash . No están haciendo lo mismo.
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.