
على الرغم من كل
الحرائق ، حان الوقت للوفاء بواجبنا المدني - لدفع الضرائب. سندفع الضرائب من خلال بوابة
خدمات الدولة . سندخل الحساب الشخصي لبوابة خدمات الدولة
باستخدام توقيع إلكتروني (
مصطلحات بوابة خدمات الدولة) ، أي الحصول على شهادة تم الحصول عليها في مركز الشهادات المعتمد (CA) ، ومفتاح خاص. كلاهما أقوم بتخزينه على رمز
PKCS # 11 مع دعم التشفير الروسي:

وهكذا ، بعد أن أنجزت واجبي المدني ، قررت مرة أخرى التحقق من تشغيل التوقيع الإلكتروني في جناح المكتب
libreoffice .
لماذا قررت القيام بذلك؟ للوصول إلى بوابة Gosuslug ، أستخدم نظام التشغيل Linux ومتصفح Redfox ، وهو متصفح Mozilla Firefox تم تعديله بدعم من التشفير الروسي. كما تعلم ، تستخدم مجموعة المكتب libreoffice أيضًا متجر NSS كمخزن شهادات.
تم تثبيت متصفح Redfox-52 في المجلد / usr / local / lib64 / firefox-52.
لتوصيل مكتبات حزمة NSS (Network Security Services) مع دعم خوارزميات GOST ، قم بتعيين قيمة متغير LD_LIBRARY_PATH على النحو التالي:
$export LD_LIBRARY_PATH=/usr/local/lib64/firefox-52:$LD_LIBRARY_PATH $
كمخزن شهادات ، يستخدم libreoffice عادةً متجر شهادات من Firefox أو عميل البريد الإلكتروني Thunderbird أو حزمة Seamonkey المدمجة. لا شيء يمنعك من استخدام متجر شهادات متصفح GoogleChrome / Cromium أو إنشاء متجر مستقل خاص بك (أدوات-> خيارات-> أمان-> شهادة):

بعد تحديد التخزين ، يتم توصيل المكتبات ، وتشغيل libreoffice ، وإنشاء ملف odt ومحاولة التوقيع عليه (File-> Digital Signatures-> Digital Signatures).
يتم عرض الشهادات في مستودع Firefox / NSS والتحقق منها بنجاح:

ومع ذلك ، لا يتم تشكيل التوقيع بعد تحديد الشهادة والضغط على زر موافق:

يبدو أن libreoffice لا تريد فهم خوارزميات التشفير الروسية ، على الرغم من حقيقة استخدام NSS من متصفح Redfox ، الذي يفهم خوارزميات GOST ، والتي تم تأكيدها من خلال التحقق من الشهادة بنجاح.
قمنا بالمحاولة الثانية: هذه المرة سنحاول توقيع ملف PDF. للقيام بذلك ، قم بتصدير الوثيقة المعدة بتنسيق PDF. لتوقيع ملف PDF ، تحتاج بطبيعة الحال إلى تنزيله (ملف-> تواقيع رقمية-> توقيع PDF). بعد تنزيله ، نحاول توقيعه (ملف-> تواقيع رقمية-> تواقيع رقمية) (انظر أعلاه ، حدد الشهادة ، حدد ، على سبيل المثال ، الغرض من توقيع الوثيقة):

وتم تشكيل التوقيع !!! نرى أن التوقيع ، يتكون على أساس شهادة "اختبار 12 512" مع مفتاح GOST R 34.10-2012 512 بت. التوقيع صحيح.
الخروج من libreoffice. قم بتشغيل libreoffice مرة أخرى ، قم بتحميل ملف pdf الموقع ، تحقق من التوقيعات. كل شيء على ما يرام. عرض شهادات الموقعين. كل شيء على ما يرام. معجزات! توقيع ملفات PDF يعمل. نضع التوقيع الثاني والثالث ... كل شيء يعمل. ولكن هناك شيء يطارد. نقوم بفحص إضافي.
افتح ملف PDF الموقع (لقد استخدمت المحرر المدمج من mc - Midnight Commander - مدير ملفات وحدة التحكم لنظام Linux). ابحث عن التوقيع الإلكتروني (/ النوع / Sig /):

كما ترى ، يتم تخزين التوقيع في شكل سداسي عشري رمزي. نقوم بنسخه وحفظه في ملف. لتحويل الملف إلى ملف ثنائي (ترميز DER) ، نستخدم الأداة المساعدة xxd:
$xxd –p –r < PDF> > <>.der $
يحتوي الملف الناتج على توقيع بتنسيق PKCS # 7 غير مشفر. الآن يمكن عرض هذا التوقيع مع أي asn1-prase ، على سبيل المثال ، مع أداة opensl. ولكن نظرًا لأننا نتحدث عن حزمة NSS ، فسنستخدم
الأداة المساعدة derdump أو
الأداة المساعدة pp :
$pp –t p7 –u –i pkcs7_detach.p7 PKCS
ثم اتضح أنه ليس كل شيء على ما يرام. نعم ، خوارزمية تشفير Digest: GOST R 34.10-2012 خوارزمية توقيع 512 الرئيسية وفقًا للشهادة المحددة للتوقيع ، ولكن يتم إنشاء التوقيع من تجزئة محسوبة باستخدام خوارزمية SHA-256 (خوارزمية Digest (1): SHA-256). وهذا خطأ من النقطة: يجب اعتبار تجزئة GOST R 34.10-2012 المفتاح 512 وفقًا لخوارزمية GOST R 34.11-2012-512.
دعونا ننتقل إلى تحليل شفرة مصدر libreoffice: الشيطان ليس فظيعًا للغاية كما هو مرسوم. في هذه المقالة ، نعتبر استخدام حزمة NSS لإنشاء توقيع إلكتروني. إذا كان أي شخص يفضل على منصة MS Windows ، استخدم CryptoAPI (وبالتالي ، GOST-CSP) ، يمكن ، عن طريق القياس مع هذه المادة ، إجراء المراجعة المقابلة.
أظهر التحليل أنه يجب إجراء التغييرات في ملفين فقط:
-
~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx-
~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxxترتبط هذه التغييرات بالاختيار الصحيح لوظيفة التجزئة لشهادات GOST. سيُحدد اختيار وظيفة التجزئة حسب نوع مفتاح الشهادة. اختيار خوارزمية التجزئة ، على سبيل المثال ، في PDFWriter :: Sign (file pdfwriter_impl.cxx) سيبدو كما يلي:
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)); . . . }
التغييرات الأخرى في المنطق مماثلة لتلك. يقع تصحيح الملف ~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx
يقع تصحيح الملف ~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxx
بعد إجراء التغييرات ، نقوم ببناء حزمة libreoffice. أثرت التغييرات التي أجريت على ثلاث مكتبات (/ usr / lib64 / libreoffice / program):
- libvcllo.so ؛
- libxmlsecurity.so ؛
- libxsec-xmlsec.so
تم استبدال هذه المكتبات الثلاث في توزيع libreoffice المثبت (/ usr / lib64 / libreoffice / program).
بعد ذلك ، ذهب التوقيع والتحقق من توقيع GOST في ملفات PDF دون وجود عوائق. وهنا في أحد المواقع يلفت انتباه المرء بمثل هذا المقتطف:
خدمة الضرائب الفيدرالية لديها خدمة ممتازة للحصول على مقتطف من سجل الكيانات القانونية الموحدة لأي كيان قانوني ، ومجاني تمامًا. يمكن الحصول على مقتطف في شكل وثيقة PDF موقعة بتوقيع إلكتروني مؤهل. ويمكن إرسال هذا المقتطف إلى بنك تجاري أو وكالة حكومية ، ولن يُطلب منك ذلك في شكل ورقي. الكل في الكل ، مريح جدا.
نطلب ونستقبل ونتحقق من:

تجدر الإشارة إلى أنه لا يجب أن تنسى أن تقوم بتثبيت سلسلة من الشهادات الموثوق بها للشهادة الموقعة في المستودع. لكن هذا طبيعي.
هذا كل شيء ، الآن هناك إمكانية استخدام توقيع إلكتروني (واحد أو أكثر) في ملفات PDF. إنها مريحة للغاية عند تنسيق المستندات وتخزينها.
وإذا اعتاد شخص ما على العمل باستخدام التوقيع الإلكتروني الكلاسيكي بتنسيق PKCS # 7 سواء كان متصلاً أو غير متصل ، فقد تم إعداد إصدار محدث (لمنصات Linux و Windows)
لحزمة رسومات
GUINSSPY :

تم إجراء التطوير في Python3 ، وإذا لم تكن هناك مشاكل في نظام Linux الأساسي ، فيجب عليّ التعرق على الترميزات على نظام التشغيل Windows. في الواقع ، كان تطورًا منفصلًا وهذا يتطلب مقالة منفصلة. يمكن رؤية كل هذه الفروق الدقيقة في شفرة المصدر.
باستخدام هذه الأداة ، يمكنك إنشاء مخزن شهادات للمكتبة ، وإدارة الشهادات ، وتوقيع الملفات ، وما إلى ذلك:

تتيح لك الأداة المساعدة أيضًا إنشاء طلب شهادة بإنشاء زوج مفاتيح ، والذي يمكن بعد ذلك نقله إلى مركز الشهادة ، وتثبيت الشهادة المستلمة في المستودع:

وإذا قام مصنعو شوك لينكس المحليون بتعديل الحزم المختلفة (NSS و Firefox و Thunderbiird و GnuPG / SMIME و SSH و KMail و Kleopatra و LibreOffice و OpenSSL وما إلى ذلك) للعمل مع التشفير الروسي ، فيمكنك سيكون حول استبدال الواردات في مجال التشفير.