
Terlepas dari semua
kebakaran itu , waktunya telah tiba untuk memenuhi tugas kewarganegaraan kita - membayar pajak. Kami akan membayar pajak melalui portal
Layanan Negara . Kami akan memasukkan akun pribadi portal Layanan Negara
menggunakan tanda tangan elektronik (
terminologi portal Layanan Negara), yaitu memiliki sertifikat yang diperoleh di pusat sertifikasi terakreditasi (CA), dan kunci pribadi. Keduanya saya simpan di
token PKCS # 11 dengan dukungan untuk kriptografi Rusia:

Maka, setelah memenuhi tugas kewarganegaraan saya, saya memutuskan untuk sekali lagi memeriksa karya tanda tangan elektronik di suite office
libreoffice .
Mengapa saya memutuskan untuk melakukan ini? Untuk mengakses portal State Services, saya menggunakan Linux dan browser Redfox, yang merupakan browser Mozilla Firefox yang dimodifikasi dengan dukungan kriptografi Rusia. Seperti yang Anda ketahui, suite kantor libreoffice juga menggunakan toko NSS sebagai toko sertifikat.
Browser Redfox-52 diinstal di folder / usr / local / lib64 / firefox-52.
Untuk menghubungkan pustaka paket NSS (Network Security Services) dengan dukungan untuk algoritma GOST, tetapkan nilai variabel LD_LIBRARY_PATH sebagai berikut:
$export LD_LIBRARY_PATH=/usr/local/lib64/firefox-52:$LD_LIBRARY_PATH $
Sebagai toko sertifikat, libreoffice biasanya menggunakan toko sertifikat dari Firefox, klien email Thunderbird, atau paket Seamonkey terintegrasi. Tidak ada yang mencegah Anda menggunakan toko sertifikat browser GoogleChrome / Cromium atau membuat toko independen Anda sendiri (Alat-> Opsi-> Keamanan-> Sertifikat):

Setelah penyimpanan dipilih, perpustakaan terhubung, jalankan libreoffice, buat file odt dan coba untuk menandatanganinya (File-> Digital Signatures-> Digital Signatures).
Sertifikat di repositori Firefox / NSS berhasil ditampilkan dan diverifikasi:

Namun, tanda tangan setelah memilih sertifikat dan menekan tombol OK tidak terbentuk:

Tampaknya libreoffice tidak ingin memahami algoritma kriptografi Rusia, meskipun fakta bahwa NSS digunakan dari browser Redfox, yang memahami algoritma GOST, yang dikonfirmasi oleh verifikasi sertifikat yang berhasil.
Kami melakukan upaya kedua: kali ini kami akan mencoba menandatangani file PDF. Untuk melakukan ini, ekspor dokumen yang disiapkan dalam format PDF. Untuk menandatangani file PDF, Anda perlu mengunduhnya (File-> Digital Signatures-> Sign PDF). Setelah mengunduhnya, kami mencoba menandatanganinya (File-> Digital Signatures-> Digital Signatures) (lihat di atas, pilih sertifikat, tentukan, misalnya, tujuan menandatangani dokumen):

Dan tanda tangan terbentuk !!! Kita melihat bahwa tanda tangan, terbentuk berdasarkan sertifikat "Uji 12 512" dengan kunci GOST R 34,10-2012 512 bit. Tanda tangannya benar.
Keluar dari libreoffice. Jalankan libreoffice lagi, muat file pdf yang ditandatangani, periksa tanda tangan. Semuanya baik-baik saja. Lihat sertifikat penandatangan. Semuanya baik-baik saja. Mukjizat! Menandatangani PDF berfungsi. Kami menempatkan tanda tangan kedua, ketiga ... Semuanya berfungsi. Tapi ada sesuatu yang menghantui. Kami melakukan pemeriksaan tambahan.
Buka file PDF yang ditandatangani (saya menggunakan editor bawaan dari mc - Midnight Commander - file manager konsol untuk Linux). Temukan tanda tangan elektronik (/ Type / Sig /):

Seperti yang Anda lihat, tanda tangan disimpan dalam bentuk heksadesimal simbolik. Kami menyalinnya dan menyimpannya dalam file. Untuk mengonversi file menjadi biner (penyandian DER), kami menggunakan utilitas xxd:
$xxd βp βr < PDF> > <>.der $
File yang dihasilkan berisi tanda tangan format DER-encoded PKCS # 7 terputus. Sekarang tanda tangan ini dapat dilihat dengan asn1-prase, misalnya, dengan utilitas openssl. Tetapi karena kita berbicara tentang paket NSS, kita akan menggunakan
utilitas derdump atau
utilitas pp :
$pp βt p7 βu βi pkcs7_detach.p7 PKCS
Dan kemudian menjadi jelas bahwa tidak semuanya baik. Ya, Algoritma Enkripsi Digest: GOST R 34.10-2012 Kunci algoritme tanda tangan 512 sesuai dengan sertifikat yang dipilih untuk ditandatangani, tetapi tanda tangan dihasilkan dari hash yang dihitung menggunakan algoritma SHA-256 (Digest Algorithm (1): SHA-256). Dan ini salah dari titik: hash untuk GOST R 34.10-2012 Kunci 512 harus dipertimbangkan sesuai dengan algoritma GOST R 34.11-2012-512.
Mari kita pergi ke analisis kode sumber libreoffice: iblis tidak begitu mengerikan seperti yang dilukis. Dalam artikel ini, kami mempertimbangkan penggunaan paket NSS untuk menghasilkan tanda tangan elektronik. Jika ada yang lebih suka pada platform MS Windows, gunakan CryptoAPI (dan, karenanya, GOST-CSP), dapat, dengan analogi dengan materi ini, membuat revisi yang sesuai.
Analisis menunjukkan bahwa perubahan harus dilakukan hanya dalam dua file:
-
~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx-
~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxxPerubahan ini terkait dengan pemilihan fungsi hash yang benar untuk sertifikat GOST. Pilihan fungsi hash akan ditentukan tergantung pada jenis kunci sertifikat. Memilih algoritma hash, misalnya, di PDFWriter :: Masuk (file pdfwriter_impl.cxx) akan terlihat seperti ini:
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)); . . . }
Perubahan lain dalam logika mirip dengan ini. Patch untuk file ~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx berada
Patch untuk file ~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxx berada
Setelah melakukan perubahan, kami membangun paket libreoffice. Perubahan yang dilakukan memengaruhi tiga pustaka (/ usr / lib64 / libreoffice / program):
- libvcllo.so ;
- libxmlsecurity.so ;
- libxsec-xmlsec.so
Ketiga perpustakaan ini diganti dalam distribusi libreoffice yang terinstal (/ usr / lib64 / libreoffice / program).
Setelah itu, penandatanganan dan verifikasi tanda tangan GOST dalam file PDF berjalan tanpa hambatan. Dan di sini di salah satu situs yang menarik perhatian kutipan seperti:
Layanan Pajak Federal memiliki layanan yang sangat baik untuk mendapatkan ekstrak dari Daftar Badan Hukum Negara Kesatuan untuk badan hukum apa pun, dan benar-benar gratis. Ekstrak dapat diperoleh dalam bentuk dokumen PDF yang ditandatangani oleh tanda tangan elektronik yang memenuhi syarat. Dan ekstrak seperti itu dapat dikirim ke bank komersial, lembaga pemerintah, dan Anda tidak akan diminta dalam bentuk kertas. Semua dalam semua, sangat nyaman.
Kami memesan, menerima, dan memverifikasi:

Perlu diingat bahwa Anda tidak boleh lupa untuk menginstal di rantai sertifikat tepercaya untuk sertifikat penandatangan. Tapi ini alami.
Itu saja, sekarang ada kemungkinan menggunakan tanda tangan elektronik (satu atau lebih) dalam file PDF. Sangat nyaman saat mengoordinasikan dokumen dan menyimpan dokumen.
Dan jika seseorang terbiasa bekerja dengan tanda tangan elektronik klasik dalam format PKCS # 7 yang terhubung dan terputus, maka versi terbaru (untuk platform Linux dan Windows) dari paket grafik
GUINSSPY telah
disiapkan :

Pengembangan dilakukan dalam Python3 dan jika tidak ada masalah pada platform Linux, maka pada MS Windows saya harus berkeringat dengan pengkodean. Bahkan, itu adalah pengembangan terpisah dan ini membutuhkan artikel terpisah. Semua nuansa ini dapat dilihat dalam kode sumber.
Dengan menggunakan utilitas ini, Anda dapat membuat toko sertifikat untuk libreoffice, mengelola sertifikat, menandatangani file, dll .:

Utilitas ini juga memungkinkan Anda untuk membuat permintaan sertifikat dengan pembuatan pasangan kunci, yang kemudian dapat ditransfer ke pusat sertifikasi, dan menginstal sertifikat yang diterima di repositori:

Dan jika produsen garpu Linux domestik memodifikasi berbagai paket (NSS, Firefox, Thunderbiird, GnuPG / SMIME, SSH, KMail, Kleopatra, LibreOffice, OpenSSL, dll., Dll) untuk bekerja dengan kriptografi Rusia, maka Anda dapat Itu akan tentang substitusi impor di bidang kriptografi.