
Apesar de todos os
incêndios , chegou a hora de cumprir nosso dever cívico - pagar impostos. Pagaremos impostos através do portal de
Serviços do
Estado . Entraremos na conta pessoal do portal de Serviços de Estado
usando uma assinatura eletrônica (
terminologia do portal de Serviços de Estado), ou seja, tendo em mãos um certificado obtido em um centro de certificação credenciado (CA) e uma chave privada. Os dois armazenam no
token PKCS # 11 com suporte para criptografia russa:

E assim, tendo cumprido meu dever cívico, decidi mais uma vez verificar o funcionamento da assinatura eletrônica na suíte de escritório do
libreoffice .
Por que eu decidi fazer isso? Para acessar o portal dos Serviços de Estado, eu uso o Linux e o navegador Redfox, que é um navegador Mozilla Firefox modificado com suporte à criptografia russa. Como você sabe, o pacote do libreoffice office também usa o repositório NSS como repositório de certificados.
O navegador Redfox-52 foi instalado na pasta / usr / local / lib64 / firefox-52.
Para conectar as bibliotecas do pacote NSS (Network Security Services) com suporte aos algoritmos GOST, defina o valor da variável LD_LIBRARY_PATH da seguinte maneira:
$export LD_LIBRARY_PATH=/usr/local/lib64/firefox-52:$LD_LIBRARY_PATH $
Como um repositório de certificados, o libreoffice normalmente usa um repositório de certificados do Firefox, o cliente de email Thunderbird ou o pacote Seamonkey integrado. Nada impede que você use o armazenamento de certificados dos navegadores GoogleChrome / Cromium ou crie seu próprio armazenamento independente (Ferramentas-> Opções-> Segurança-> Certificado):

Depois que o armazenamento é selecionado, as bibliotecas são conectadas, execute o libreoffice, crie um arquivo odt e tente assiná-lo (Arquivo-> Assinaturas digitais-> Assinaturas digitais).
Os certificados no repositório Firefox / NSS são exibidos e verificados com sucesso:

No entanto, a assinatura após selecionar o certificado e pressionar o botão OK não é formada:

Parece que o libreoffice não quer entender os algoritmos criptográficos russos, apesar do NSS ser usado no navegador Redfox, que entende os algoritmos GOST, o que é confirmado por uma verificação de certificado bem-sucedida.
Nós fazemos a segunda tentativa: desta vez, tentaremos assinar o arquivo PDF. Para fazer isso, exporte o documento preparado no formato PDF. Para assinar um arquivo PDF, é necessário fazer o download naturalmente (Arquivo-> Assinaturas digitais-> Assinar PDF). Após o download, tentamos assiná-lo (Arquivo-> Assinaturas digitais-> Assinaturas digitais) (veja acima, selecione o certificado, especifique, por exemplo, a finalidade de assinar o documento):

E a assinatura é formada !!! Vemos que a assinatura, formada com base no certificado "Teste 12 512" com a chave GOST R 34.10-2012 512 bits. A assinatura está correta.
Saindo do libreoffice. Execute o libreoffice novamente, carregue o arquivo pdf assinado, verifique as assinaturas. Está tudo bem. Ver certificados de assinantes. Está tudo bem. Milagres! A assinatura de PDFs funciona. Colocamos a segunda, terceira assinatura ... Tudo funciona. Mas algo está assombrando. Fazemos uma verificação adicional.
Abra o arquivo PDF assinado (usei o editor interno do mc - Midnight Commander - gerenciador de arquivos do console para Linux). Encontre a assinatura eletrônica (/ Type / Sig /):

Como você pode ver, a assinatura é armazenada na forma hexadecimal simbólica. Copiamos e salvamos em um arquivo. Para converter o arquivo em binário (codificação DER), usamos o utilitário xxd:
$xxd –p –r < PDF> > <>.der $
O arquivo resultante contém uma assinatura de formato PKCS # 7 codificada por DER desconectada. Agora, essa assinatura pode ser visualizada com qualquer asn1-prase, por exemplo, com o utilitário openssl. Mas, como estamos falando do pacote NSS, usaremos o
utilitário derdump ou o
utilitário pp :
$pp –t p7 –u –i pkcs7_detach.p7 PKCS
E então ficou claro que nem tudo é tão bom. Sim, o algoritmo de assinatura Digest Encryption: GOST R 34.10-2012 algoritmo de assinatura Key 512 de acordo com o certificado selecionado para assinatura, mas a assinatura é gerada a partir de um hash calculado usando o algoritmo SHA-256 (Algoritmo Digest (1): SHA-256). E isso está errado desde o ponto: o hash da chave 512 do GOST R 34.10-2012 deve ser considerado de acordo com o algoritmo GOST R 34.11-2012-512.
Vamos começar com a análise do código fonte do libreoffice: o diabo não é tão terrível quanto é pintado. Neste artigo, consideramos o uso do pacote NSS para gerar uma assinatura eletrônica. Se alguém preferir na plataforma MS Windows, use CryptoAPI (e, consequentemente, GOST-CSP), pode, por analogia com este material, fazer a revisão correspondente.
A análise mostrou que as alterações deverão ser feitas em apenas dois arquivos:
-
~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx-
~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxxEssas alterações estão associadas à seleção correta da função de hash para certificados GOST. A escolha de uma função de hash será determinada dependendo do tipo de chave do certificado. A escolha de um algoritmo de hash, por exemplo, em PDFWriter :: Sign (arquivo pdfwriter_impl.cxx) terá a seguinte aparência:
bool PDFWriter::Sign(PDFSignContext& rContext) { #ifndef _WIN32 SECKEYPublicKey *pubk = NULL; SECOidTag hashAlgTag; HASH_HashType hashType; int hashLen; CERTCertificate *cert = CERT_DecodeCertFromPackage(reinterpret_cast<char *>(rContext.m_pDerEncoded), rContext.m_nDerEncoded); if (!cert) { SAL_WARN("vcl.pdfwriter", "CERT_DecodeCertFromPackage failed"); return false; } /* */ pubk = CERT_ExtractPublicKey(cert); if (pubk == NULL) return NULL; /* */ switch(pubk->keyType){ case gost3410Key: hashAlgTag = SEC_OID_GOSTHASH; hashType = HASH_AlgGOSTHASH; hashLen = SHA256_LENGTH; break; case gost3410Key_256: hashAlgTag = SEC_OID_GOST3411_2012_256; hashType = HASH_AlgGOSTHASH_12_256; hashLen = SHA256_LENGTH; break; case gost3410Key_512: hashAlgTag = SEC_OID_GOST3411_2012_512; hashLen = SHA256_LENGTH * 2; hashType = HASH_AlgGOSTHASH_12_512; break; default: hashAlgTag = SEC_OID_SHA256; hashType = HASH_AlgSHA256; hashLen = SHA256_LENGTH; break; } /* */ HashContextScope hc(HASH_Create(hashType)); . . . }
Outras mudanças na lógica são semelhantes a estas. O patch para o arquivo ~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx está localizado
O patch para o arquivo ~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxx está localizado
Após fazer as alterações, criamos o pacote libreoffice. As alterações feitas afetaram três bibliotecas (/ usr / lib64 / libreoffice / program):
- libvcllo.so ;
- libxmlsecurity.so ;
- libxsec-xmlsec.so
Essas três bibliotecas foram substituídas na distribuição libreoffice instalada (/ usr / lib64 / libreoffice / program).
Depois disso, a assinatura e a verificação da assinatura GOST nos arquivos PDF foram sem problemas. E aqui, em um dos sites, chama-se atenção com esse trecho:
O Serviço Tributário Federal oferece um excelente serviço para obter um extrato do Registro Estadual Unificado de Pessoas Jurídicas de qualquer entidade jurídica e totalmente gratuito. Um extrato pode ser obtido na forma de um documento PDF assinado por uma assinatura eletrônica qualificada. E esse extrato pode ser enviado a um banco comercial, agência governamental, e você não será solicitado em papel. Ao todo, muito confortável.
Solicitamos, recebemos e verificamos:

Vale lembrar que você não deve esquecer de instalar no repositório uma cadeia de certificados confiáveis para o certificado de signatário. Mas isso é natural.
Isso é tudo, agora existe a possibilidade de usar uma assinatura eletrônica (uma ou mais) em arquivos PDF. É muito conveniente ao coordenar documentos e armazenar documentos.
E se alguém está acostumado a trabalhar com a assinatura eletrônica clássica no formato PKCS # 7, conectada e desconectada, uma versão atualizada (para as plataformas Linux e Windows) do pacote gráfico
GUINSSPY foi
preparada :

O desenvolvimento foi conduzido em Python3 e, se não houvesse problemas na plataforma Linux, no MS Windows eu precisava suar com codificações. Na verdade, era um desenvolvimento separado e isso requer um artigo separado. Todas essas nuances podem ser vistas no código fonte.
Usando este utilitário, você pode criar um armazenamento de certificados para o libreoffice, gerenciar certificados, assinar arquivos etc.:

O utilitário também permite criar uma solicitação de certificado com a geração de um par de chaves, que pode ser transferido para o centro de certificação e instalar o certificado recebido no repositório:

E se os fabricantes de forks domésticos do Linux modificaram vários pacotes (NSS, Firefox, Thunderbiird, GnuPG / SMIME, SSH, KMail, Kleopatra, LibreOffice, OpenSSL, etc., etc.) para trabalhar com criptografia russa, você pode Seria sobre substituição de importações no campo da criptografia.