Como verificar a assinatura em um arquivo usando o OpenSSL com mecanismo personalizado

3

Atualização de 28 de dezembro de 2017 - 3 :

O autor do módulo OpenSSL DSTU gentilmente forneceu o patch para a implementação do OpenSSL + DSTU com uma correção para o problema e ajudou ainda mais.

Consegui realizar o que preciso primeiro com este comando:

./apps/openssl smime -verify -noverify -in my_message.txt.p7s -engine dstu -inform DER
engine "dstu" set.
Hello, world!
Verification successful

Mais tarde, após concatenar uma cadeia de certificados em bundle.pem , eu foi capaz de fazer isso:

./apps/openssl smime -verify -CAfile bundle.pem -in /yo/my_message.txt.p7s -engine dstu -inform DER
engine "dstu" set.
Hello, world!
Verification successful

Atualização de 28 de dezembro de 2017 - 2 :

O autor do módulo OpenSSL DSTU confirmou que o módulo não está funcionando corretamente no momento - link .

Acho que vou ter que procurar em outro lugar para encontrar uma implementação adequada do DSTU4145. Acabei de aprender sobre um projeto do BountyCastle e a especificação inclui o DSTU-4145. Eu acho que não há mais opções a não ser escrever algum código Java para executar a verificação de assinatura.

Atualização de 28 de dezembro de 2017 - 1 :

Aqui estão meus arquivos:

  • a mensagem a ser verificada: link
  • a mensagem a ser verificada, no formato ASN.1: link
  • certificado (s) que estou tentando verificar com: link

Eu tenho um arquivo, assinado por alguém com sua chave privada: signed_content.txt . Eu também tenho um certificado da CA. A chave privada e o certificado estão de alguma forma relacionados entre si.

Como posso verificar a assinatura em um arquivo?

Isso é o que estou fazendo:

  1. Extraia a chave pública do certificado (obtida da autoridade):

    openssl x509 -pubkey -inform der -in PrivateCerts/CA-3004751DEF2C78AE010000000100000049000000.cer -noout -engine dstu > public_key.txt
    
  2. Tente verificar o conteúdo do arquivo:

    openssl rsautl -verify -in my_message.txt.p7s -inkey public_key.txt -pubin -engine dstu
    engine "dstu" set.
    openssl (lock_dbg_cb): already locked (mode=9, type=18) at md_rand.c:387
    openssl (lock_dbg_cb): not locked (mode=10, type=18) at dstu_rbg.c:87
    Error getting RSA key
    139964169291424:error:0607907F:digital envelope routines:EVP_PKEY_get1_RSA:expecting an rsa key:p_lib.c:288:
    

Além disso, como extraio o conteúdo real do arquivo assinado?

O arquivo que tenho está incorreto de alguma forma? Eu posso ver o conteúdo do ASN.1:

openssl asn1parse -inform DER -in my_message.txt.p7s -i

A estrutura asn.1 parece parecer OK (honestamente, eu sei muito pouco sobre ASN.1): Eu posso ver alguns campos sobre organização e outras coisas.

Estou usando um mecanismo DSTU (padrão de criptografia ucraniano), semelhante ao GOST (padrão de criptografia russo).

    
por gmile 27.12.2017 / 20:41

2 respostas

0

openssl rsautl manipula apenas o algoritmo RSA, e não qualquer outro algoritmo: não DSA, não ECDSA, não GOST, não DSTU, etc. openssl pkeyutl -sign/-verify pode manipular qualquer algoritmo disponível por meio da interface EVP padrão, qual seu motor presumivelmente deveria.

No entanto, a maioria dos algoritmos de assinatura realmente assina um hash dos dados, não os dados originais. Em particular, vejo o BouncyCastle tem vários esquemas de assinatura usando GOST3411 (um hash) com DSTU4145 (e com ou sem codificação LE aka Little-Endian). Para isso, você precisa explicitamente usar hash e usar openssl pkeyutl , ou mais facilmente usar openssl dgst -$hashname -sign/-verify , que os combina para você. Para hashes incorporados, você pode abreviar isso para openssl $hashname -sign/-verify , mas não sei se isso funciona para um hash de mecanismo.

Em qualquer caso, você quase certamente não quer tratar todos os signed_content.txt como dados, muito menos como o hash dos dados. Se tiver estrutura ASN.1, provavelmente inclui os dados assinados (como apenas parte da estrutura) mais o valor da assinatura e, provavelmente, metadados ou até mesmo outros dados. Se for uma estrutura comum e você publicar o resultado asn1parse , com todos os valores de dados que você considera confidenciais suprimidos, mas todos os metadados como OIDs intactos, eu ou outra pessoa aqui pode reconhecê-lo e avisar. Se for a estrutura mais comum, o CMS / PKCS7, a linha de comando do OpenSSL pode manipular isso diretamente.

    
por 28.12.2017 / 05:50
0

How do I verify the signature on a file?

O openssl smime -verify ... simples deve funcionar mesmo com o mecanismo dstu:

$ openssl1.0 smime -verify -noverify -engine dstu -inform DER -in my_message.txt.p7s

engine "dstu" set.

Hello, world!

Verification successful

É disso que você precisa? Quando removo a opção -noverify , obtenho a falha de verificação Verify error:unable to get local issuer certificate , mas está relacionada à verificação automática do certificado, não à mensagem. Minha ferramenta openssl1.0 é como o openssl regular 1.0.2o com patches de gost e dstu aplicados.

    
por 06.08.2018 / 18:37