Como usar o openssl smime -sign para obter o valor de digestão em -out xml?

1

Queria saber o comando de openssl smime -sign para obter o valor de resumo.

Algo como abaixo -

MIME-Version: 1.0
Content-Type: multipart/signed;protocol="application/pkcs7-
signature";micalg="sha-256";boundary="707e08bf1d5b44f6b18bc0999df569c8"

This is an S/MIME signed message

--707e08bf1d5b44f6b18bc0999df569c8
<cms>
<file>
<name>index.xml</name>
<digest>4pDBO3/ZNCpaAvxOWbQ0AUnDbT1oAaWMrPIDZz/a1i0=</digest>
<digesttype>sha256</digesttype>
<path>.</path>
</file>
</cms>
--707e08bf1d5b44f6b18bc0999df569c8
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B

......

Qual é o comando para gerá-lo?

verificar usando -

openssl smime -verify -in sign -CAfile Sign_Key.crt -out xmlwithdigest
openssl dgst -binary -sha256 infile  | openssl base64

e depois comparando o valor digerido?

    
por Amruth A 27.06.2018 / 15:20

1 resposta

4

Sua mensagem é claramente uma tentativa de receber uma mensagem S / MIME assinada claramente (também conhecida como assinatura desconectada), consulte rfc5751 sec 3.4.3 et pred, embora não seja realmente correto; a primeira parte, que é a entidade de dados, não possui cabeçalhos MIME.

Alguns softwares, incluindo o OpenSSL, podem manipular esse desvio, mas o OpenSSL (ainda!) cria assinaturas desanexadas com o subtipo x-pkcs7-signature da v2 (rfc2311) e não a pkcs7-signature das versões mais recentes que sua mensagem possui.

Uma assinatura separada do PKCS7 / CMS, conforme usada neste tipo de mensagem S / MIME, possui vários componentes opcionais que podem ser usados ou não. A partir dos dados truncados mostrados, é impossível determinar quais opções a mensagem usa e, de qualquer maneira, você não indica se se importa com essas opções de uma forma ou de outra.

What is the command to generate it ?

Com o OpenSSL, openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile] sem -nodetach cria uma mensagem neste formato, exceto conforme mencionado acima, usando o subtipo mais antigo com x- . A opção -inkey pode ser omitida se a chave privada estiver incluída no mesmo arquivo que o certificado. Você pode, opcionalmente:

  • inclua ou não o certificado do assinante
  • incluir explicitamente certificado (s) adicional (de cadeia)
  • use signedAttributes ou não, conforme descrito na página man do seu sistema ou on-line . Você pode inserir e exportar para arquivos nomeados ou usar stdin e stdout que podem, por sua vez, ser redirecionados ou canalizados pelo shell (ou SO).

    Exceto para versões muito antigas do OpenSSL (0.9.8 ou inferior), você também pode usar openssl cms , que na verdade é um superconjunto de openssl smime e apesar de seu nome padrão para fazer S / MIME - - para obter openssl smime ou openssl cms para fazer o CMS, você deve especificar -outform para assinar ou criptografar ou -inform para verificar ou descriptografar!

O comando smime verify no seu Q verifica a assinatura S / MIME (e, por padrão, a cadeia de certificados aplicável também, mas parece que você está usando um certificado independente e, portanto, não há cadeia real) e, em seguida, o descarta. gerando apenas os dados assinados, que no seu caso é XML.

A tag externa <cms> poderia significar que esses dados destinam-se a representar a Sintaxe da Mensagem Criptográfica, o sucessor de PKCS7 (rfc5652 et pred), mas essa combinação de dados não corresponde a nenhuma mensagem do CMS . Os nomes sugerem que ele contém um valor de hash para um arquivo específico; se você tiver uma cópia (suposta) desse arquivo e quiser verificar o hash no arquivo, o OpenSSL não poderá fazer isso automaticamente (nem mesmo a verificação feita por comandos comuns do Unix {md5,sha1,etc}sum -c usando um formato de texto ad-hoc mais simples). Para verificar manualmente, seu segundo comando é um início correto; para extrair o hash do XML, você poderia fazer algo como

 $ grep -Po '<digest>\K[^<]*' 

ou se você não tiver um grep com o PCRE, existem equivalentes com sed awk perl quase certamente cobertos por outros Qs aqui; e compare os dois valores de hash com o shell test "$x" == "$y" ou [ "$x" == "$y" ] , ou bash, ksh, zsh [[ ou awk ou perl , ou outros métodos.

OTOH se o seu problema é realmente criar esse corpo XML, o OpenSSL só pode fazer o valor de hash; o restante terá que usar ferramentas de texto padrão ou possivelmente ferramentas XML.

    
por 21.07.2018 / 00:49

Tags