Vários métodos de assinatura OpenSSL RSA produzem resultados diferentes

Tentando entender a assinatura e usar / testar várias opções.

Eu posso assinar usando este comando:

openssl dgst -sha256 -sign private_key.pem -binary -out sig_file data_file

Mas a documentação parece dizer que eu também posso usar esse método

openssl dgst -sha256 -binary data_file > hash_file
openssl rsautl -sign -inkey private_key.pem -keyform PEM -in hash_file > sig_file2

Mas as assinaturas são diferentes quando eu esperava que fossem idênticas. Ou eu perdi algo nas opções ou algo mais está errado nas minhas suposições.

A verdadeira questão deste problema: existe uma maneira de assinar usando opções de linha de comando, já que eu já tenho o valor de hash e produzo uma assinatura idêntica ao primeiro comando acima.

Para adicionar mais, eu posso reproduzir o primeiro comando facilmente no código e ele corresponde ao primeiro comando acima, o que significa que posso assinar com o valor de hash calculado primeiro.

mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
EVP_DigestUpdate(mdctx, data, len);
EVP_DigestFinal_ex(mdctx, hash, &s);
EVP_MD_CTX_destroy(mdctx);

kfile = fopen64(key_file, "r");
key = PEM_read_RSAPrivateKey(kfile, NULL, NULL, NULL);
fclose(kfile);

*sig = malloc(RSA_size(key));
RSA_sign(NID_sha256, hash, hlen, *sig, siglen, key);

questionAnswers(1)

yourAnswerToTheQuestion