O seguinte conjunto de comandos tentative parece funcionar com o openssl 1.0.2g e 1.1.0g. Em comparação com essa outra outra resposta , ela visa gerar uma assinatura do arquivo (incluindo a etapa de hash padrão obrigatória), em vez que uma assinatura (incluindo uma segunda etapa hash) da representação ASCII hexadecimal minúscula de um primeiro hash do arquivo. Também usa hash e tamanho de módulo mais modernos.
# generate parameters with 2048-bit DSA, SHA-256 (can be common to multiple keys)
openssl genpkey -genparam -algorithm DSA -pkeyopt dsa_paramgen_bits:2048 -pkeyopt dsa_paramgen_q_bits:256 -pkeyopt dsa_paramgen_md:sha256 -out dsaparams.pem
# 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
Nota: Uma tentativa anterior tornou o openssl 1.0.2g gerar assinaturas com 160 bits q (talvez usando SHA-1). Por comentário , adicionei -sha256
a openssl dgst
, mas não fez diferença. As experiências sugerem que é necessário usar -pkeyopt dsa_paramgen_q_bits:256
, mesmo que a página do manual explique explicitamente -pkeyopt dsa_paramgen_md:sha256
cuida disso:
dsa_paramgen_md:digest
The digest to use during parameter generation. Must be one of sha1
, sha224
or sha256
. If set, then the number of bits in q will match the output size of the specified digest and the dsa_paramgen_q_bits
parameter will be ignored (..)