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 smime
e apesar de seu nome padrão para fazer S / MIME - - para obteropenssl smime
ouopenssl 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.