Queria saber o comando do openssl smime -sign para obter o valor do 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?
verificando usando -
openssl smime -verify -in sign -CAfile Sign_Key.crt -out xmlwithdigest
openssl dgst -binary -sha256 infile | openssl base64
em seguida, comparando o valor do resumo?
Sua mensagem é claramente uma tentativa de uma mensagem S/MIME com assinatura clara (também conhecida como assinatura desanexada), consulte rfc5751 sec 3.4.3 et pred, embora não esteja realmente correta; a primeira parte, que é a entidade de dados, não possui cabeçalhos MIME.
Alguns softwares, incluindo o OpenSSL, podem lidar com esse desvio, mas o OpenSSL (ainda!) cria assinaturas desanexadas com subtipo
x-pkcs7-signature
de v2 (rfc2311) e nãopkcs7-signature
de versões mais recentes como sua mensagem.Uma assinatura separada 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 que você mostra, é impossível determinar quais opções essa mensagem usa e, de qualquer forma, você não indica se você se importa com essas opções de uma forma ou de outra.
Com OpenSSL,
openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile]
sem-nodetach
cria uma mensagem neste formato, exceto como observei acima usando o subtipo mais antigo comx-
. A-inkey
opção pode ser omitida se a chave privada estiver incluída no mesmo arquivo que o certificado. Você pode opcionalmente:incluir ou não o certificado do signatário
inclua explicitamente certificado(s) adicional(is) (de cadeia)
use SignedAttributes ou não conforme descrito na página man em seu sistema ou online . Você pode inserir e enviar para arquivos nomeados ou usar stdin e stdout, que por sua vez podem 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 do nome padrão , fazer S/MIME - para obter ou fazer CMS, você deve especificar para assinaropenssl smime
ou criptografar ou para verificar ou descriptografar!openssl cms
-outform
-inform
O
smime verify
comando em 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 autônomo e, portanto, não há cadeia real) e, em seguida, a descarta, produzindo apenas os dados assinados, que no seu caso é XML.A etiqueta externa
<cms>
pode significar que esses dados pretendem representar a Sintaxe da Mensagem Criptográfica, o sucessor do 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 pode fazer isso automaticamente (nem mesmo a verificação feita por{md5,sha1,etc}sum -c
comandos comuns do Unix 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 comoou se você não tem um grep com PCRE, existem equivalentes com
sed awk perl
quase certamente cobertos por outros Qs aqui; e, em seguida, compare os dois valores de hash com shelltest "$x" == "$y"
ou[ "$x" == "$y" ]
, ou bash,ksh,zsh[[
, ouawk
ouperl
, ou outros métodos.OTOH se o seu problema é realmente criar esse corpo XML, o OpenSSL só pode fazer o valor do hash; o resto terá que usar ferramentas de texto padrão, ou possivelmente ferramentas XML.