
A pesar de todos los
incendios , ha llegado el momento de cumplir con nuestro deber c铆vico: pagar impuestos. Pagaremos impuestos a trav茅s del portal de
Servicios del
Estado . Ingresaremos a la cuenta personal del portal de Servicios del Estado
utilizando una firma electr贸nica (
terminolog铆a del portal de Servicios del Estado), es decir. tener a mano un certificado obtenido en un centro de certificaci贸n acreditado (CA) y una clave privada. Ambos los
guardo en el token PKCS # 11 con soporte para la criptograf铆a rusa:

Y as铆, habiendo cumplido con mi deber c铆vico, decid铆 verificar una vez m谩s el funcionamiento de la firma electr贸nica en la suite de oficina de oficina
libre .
驴Por qu茅 decid铆 hacer esto? Para acceder al portal de servicios estatales, utilizo Linux y el navegador Redfox, que es un navegador Mozilla Firefox modificado con soporte de criptograf铆a rusa. Como saben, la suite ofim谩tica libreoffice tambi茅n utiliza la tienda NSS como una tienda de certificados.
El navegador Redfox-52 se instal贸 en la carpeta / usr / local / lib64 / firefox-52.
Para conectar las bibliotecas del paquete NSS (Network Security Services) con soporte para algoritmos GOST, establezca el valor de la variable LD_LIBRARY_PATH de la siguiente manera:
$export LD_LIBRARY_PATH=/usr/local/lib64/firefox-52:$LD_LIBRARY_PATH $
Como almac茅n de certificados, libreoffice generalmente usa un almac茅n de certificados de Firefox, el cliente de correo electr贸nico Thunderbird o el paquete integrado Seamonkey. Nada le impide usar el almac茅n de certificados del navegador GoogleChrome / Cromium o crear su propia tienda independiente (Herramientas-> Opciones-> Seguridad-> Certificado):

Despu茅s de seleccionar el almacenamiento, las bibliotecas se conectan, ejecutan libreoffice, crean un archivo impar e intentan firmarlo (Archivo-> Firmas digitales-> Firmas digitales).
Los certificados en el repositorio de Firefox / NSS se muestran y verifican con 茅xito:

Sin embargo, la firma despu茅s de seleccionar el certificado y presionar el bot贸n OK no se forma:

Parece que libreoffice no quiere entender los algoritmos criptogr谩ficos rusos, a pesar del hecho de que NSS se usa desde el navegador Redfox, que comprende los algoritmos GOST, lo que se confirma mediante una verificaci贸n de certificado exitosa.
Hacemos el segundo intento: esta vez intentaremos firmar el archivo PDF. Para hacer esto, exporte el documento preparado en formato PDF. Para firmar un archivo PDF, naturalmente necesita descargarlo (Archivo-> Firmas digitales-> Firmar PDF). Despu茅s de descargarlo, intentamos firmarlo (Archivo-> Firmas digitales-> Firmas digitales) (ver arriba, seleccione el certificado, especifique, por ejemplo, el prop贸sito de firmar el documento):

Y se forma la firma !!! Vemos que la firma, que se forma sobre la base del certificado "Prueba 12 512" con la clave GOST R 34.10-2012 512 bits. La firma es correcta.
Saliendo de la oficina libre. Ejecute libreoffice nuevamente, cargue el archivo pdf firmado, verifique las firmas. Todo esta bien. Ver certificados de firmantes. Todo esta bien. Milagros! Firmar archivos PDF funciona. Ponemos la segunda, tercera firma ... Todo funciona. Pero algo es inquietante. Hacemos un chequeo adicional.
Abra el archivo PDF firmado (utilic茅 el editor incorporado de mc - Midnight Commander - administrador de archivos de consola para Linux). Encuentre la firma electr贸nica (/ Type / Sig /):

Como puede ver, la firma se almacena en forma hexadecimal simb贸lica. Lo copiamos y lo guardamos en un archivo. Para convertir el archivo a binario (codificaci贸n DER), utilizamos la utilidad xxd:
$xxd 鈥損 鈥搑 < PDF> > <>.der $
El archivo resultante contiene una firma de formato PKCS # 7 con codificaci贸n DER desconectada. Ahora esta firma se puede ver con cualquier asn1-prase, por ejemplo, con la utilidad openssl. Pero como estamos hablando del paquete NSS, usaremos la
utilidad derdump o la
utilidad pp :
$pp 鈥搕 p7 鈥搖 鈥搃 pkcs7_detach.p7 PKCS
Y luego qued贸 claro que no todo es tan bueno. S铆, el algoritmo de cifrado impl铆cito: GOST R 34.10-2012 Algoritmo de firma clave 512 de acuerdo con el certificado seleccionado para la firma, pero la firma se genera a partir de un hash calculado utilizando el algoritmo SHA-256 (Algoritmo impl铆cito (1): SHA-256). Y esto es incorrecto desde el punto: el hash para GOST R 34.10-2012 Key 512 debe considerarse de acuerdo con el algoritmo GOST R 34.11-2012-512.
Vayamos al an谩lisis del c贸digo fuente de libreoffice: el diablo no es tan terrible como est谩 pintado. En este art铆culo, consideramos el uso del paquete NSS para generar una firma electr贸nica. Si alguien prefiere la plataforma MS Windows, use CryptoAPI (y, en consecuencia, GOST-CSP), puede, por analog铆a con este material, realizar la revisi贸n correspondiente.
El an谩lisis mostr贸 que los cambios deber谩n realizarse en solo dos archivos:
-
~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx-
~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxxEstos cambios est谩n asociados con la selecci贸n correcta de la funci贸n hash para los certificados GOST. La elecci贸n de una funci贸n hash se determinar谩 seg煤n el tipo de clave de certificado. Elegir un algoritmo hash, por ejemplo, en PDFWriter :: Sign (archivo pdfwriter_impl.cxx) se ver谩 as铆:
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)); . . . }
Otros cambios en la l贸gica son similares a estos. Se encuentra el parche para el archivo ~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx
Se encuentra el parche para el archivo ~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxx
Despu茅s de hacer los cambios, creamos el paquete libreoffice. Los cambios realizados afectaron a tres bibliotecas (/ usr / lib64 / libreoffice / program):
- libvcllo.so ;
- libxmlsecurity.so ;
- libxsec-xmlsec.so
Estas tres bibliotecas fueron reemplazadas en la distribuci贸n de libreoffice instalada (/ usr / lib64 / libreoffice / program).
Despu茅s de eso, la firma y verificaci贸n de la firma GOST en los archivos PDF se realiz贸 sin problemas. Y aqu铆, en uno de los sitios, uno capta la atenci贸n de este extracto:
El Servicio de Impuestos Federales tiene un excelente servicio para obtener un extracto del Registro Estatal Unificado de Entidades Legales para cualquier entidad legal, y de forma absolutamente gratuita. Se puede obtener un extracto en forma de documento PDF firmado por una firma electr贸nica calificada. Y dicho extracto puede enviarse a un banco comercial, agencia gubernamental, y no se le solicitar谩 en papel. En general, muy c贸modo.
Ordenamos, recibimos y verificamos:

Vale la pena recordar que no debe olvidar instalar en el repositorio una cadena de certificados de confianza para el certificado del firmante. Pero esto es natural.
Eso es todo, ahora existe la posibilidad de usar una firma electr贸nica (una o m谩s) en archivos PDF. Es muy conveniente tanto al coordinar documentos como al almacenar documentos.
Y si alguien est谩 acostumbrado a trabajar con la firma electr贸nica cl谩sica en formato PKCS # 7 conectada y desconectada, se ha
preparado una versi贸n actualizada (para las plataformas Linux y Windows) del paquete de gr谩ficos
GUINSSPY :

El desarrollo se realiz贸 en Python3 y si no hubo problemas en la plataforma Linux, entonces en MS Windows tuve que sudar con las codificaciones. De hecho, fue un desarrollo separado y esto requiere un art铆culo separado. Todos estos matices se pueden ver en el c贸digo fuente.
Con esta utilidad, puede crear un almac茅n de certificados para libreoffice, administrar certificados, firmar archivos, etc.

La utilidad tambi茅n le permite crear una solicitud de certificado con la generaci贸n de un par de claves, que luego puede transferirse al centro de certificaci贸n, e instalar el certificado recibido en el repositorio:

Y si los fabricantes de tenedores dom茅sticos de Linux modificaron varios paquetes (NSS, Firefox, Thunderbiird, GnuPG / SMIME, SSH, KMail, Kleopatra, LibreOffice, OpenSSL, etc., etc.) para trabajar con criptograf铆a rusa, entonces puede Se tratar铆a de la sustituci贸n de importaciones en el campo de la criptograf铆a.