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 deopenssl smimee apesar de seu nome padrão para fazer S / MIME - - para obteropenssl smimeouopenssl cmspara fazer o CMS, você deve especificar-outformpara assinar ou criptografar ou-informpara 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.