منذ بعض الوقت ، كانت هناك حاجة في إطار المشروع إلى الحد من العدد المتزامن لأجهزة الكمبيوتر التي يمكنها الوصول إلى تطبيق ويب يعمل داخل شبكة المنطقة المحلية للعميل.
جاء قرار استخدام الرموز المميزة لجهاز USB لتحديد الكمبيوتر بنفسه. يقع الاختيار على Rutoken EDS: إنه يعمل بدون برامج تشغيل ، للعمل في تطبيق ويب ، فأنت بحاجة فقط إلى مكون إضافي للمتصفح أصدره المطور. نظرًا لأن الرمز المميز يجب أن يحدد الكمبيوتر ، وليس المستخدم ، فإن العمل معه يجب أن يكون "شفافًا" تمامًا: إذا كان موجودًا ، فإن النظام ببساطة يعمل بصمت دون طرح أسئلة غير ضرورية للمستخدم.
تقرر: عند تسجيل الدخول إلى النظام ، قم بتوقيع بيانات اعتماد المستخدم بتوقيع غير مؤهل لشهادة مخزنة على Rutoken باستخدام البرنامج المساعد Rootoken ، وتحقق من الخادم. بعد تسجيل دخول ناجح باستخدام المكون الإضافي ، تحقق من الوجود الفعلي لنفس الرمز المميز ، وفي حالة عدم وجوده ، قم بتسجيل الخروج من النظام. في إطار المشروع المذكور ، كان هذا كافيا.
هناك حاجة إلى إنشاء المرجع المصدق الخاص بك (CA) لتبادل الرسائل الموقعة ، أو بالأحرى ، لإرسال الرسائل الموقعة من عميل إلى خادم. يجب أن تكون شهادات العميل موجودة على رموز USB في حاويات مفاتيح خاصة ، ويجب إجراء التحقق من التوقيع على الخادم باستخدام OpenSSL
لذلك ، فإن المهمة:
التثبيت والتكوين على خادم Linux من CA. نشر شهادات العميل التي تحدد أجهزة الكمبيوتر على الرموز USB .
لحلها ، سوف تحتاج إلى:
- نقوم بإنشاء دليل حيث سيتم تحديد موقع المرجع المصدق ونسخ تكوين OpenSSL المتضمن مع النظام (يوجد /etc/ssl/openssl.cnf على أحدث إصدارات Ubuntu)
- نقوم بتهيئة "our" openssl.cnf:
أ) أضف إلى بداية توجيهات الملفات لتوصيل محرك الرمز المميز:
openssl_conf = openssl_def [ openssl_def ] engines = engine_section [ engine_section ] rtengine = gost_section [ gost_section ] dynamic_path = /path/to/rutoken/openssl/connector/librtengine.so MODULE_PATH = /path/to/rutoken/pkcs11/librtpkcs11ecp.so RAND_TOKEN = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP default_algorithms = CIPHERS, DIGEST, PKEY, RAND
ب) uncomment الخط
# req_extensions = v3_req # The extensions to add to a certificate request
ج) في المقطع [v3_req] ، حدد المعلمات التالية:
subjectSignTool = ASN1:FORMAT:UTF8,UTF8String: extendedKeyUsage=emailProtection keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
د) في المقطع [v3_ca] ، أزل الخيار الحرج من المعلمة basicConstrict:
basicConstraints = CA:true
من اجل ماذا؟ إجابة صادقة: لا أعرف. ومع ذلك ، فإن جميع أمثلة شهادات الجذر التي قمت بتنزيلها أثناء محاولة معرفة الموضوع كانت بدون علامة حرجة. أنا أسأل السؤال "لماذا؟" الزملاء أكثر خبرة.
ه) اختياريا تعيين القيم الافتراضية التي سيتم تقديمها عند إصدار الشهادات الموقعة ذاتيا وتوليد طلبات لإصدار شهادات العميل. هذه المعلمات موجودة في المقطع [req_distinguished_name]
المعلمة مع postfix _default هي القيمة الافتراضية. مثال:
countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2
عندما يطلب منك النظام إدخال المعلمة countryName ، فإنه سيشير بين قوسين معقوفين إلى أنه سيترك القيمة AU افتراضيًا.
هذا يكمل تكوين التكوين OpenSSL. يبقى أن نوضح لـ OpenSSL أنه من الضروري استخدامه. للقيام بذلك ، قم بتعيين متغير البيئة OPENSSL_CONF:
export OPENSSL_CONF=/path/to/your/openssl.cnf
- نقوم بإنشاء بنية دليل حيث سيتم تخزين معلومات حول المرجع المصدق الخاص بنا.
للقيام بذلك ، انتقل إلى الدليل الذي تم إنشاؤه باستخدام opensl.cnf الذي تم تعديله للتو ، وقم بتنفيذ الخطوات التالية:
أ) إنشاء الدلائل الفرعية في ذلك:
demoCA
demoCA / الخاص
demoCA / newcerts
ملاحظة: يتم توضيح اسم demoCA في قسم [CA_default] من ملف openssl.cnf . يمكنك تغييره (في الخطوة 2) ثم العمل معه بدلاً من demoCA.
ب) في دليل demoCA ، أنشئ ملف index.txt فارغًا وملفًا تسلسليًا ، نفتحه باستخدام محرر نصوص ونكتب السطر 01. هذا هو عداد الشهادات الصادرة. بعد إصدار كل شهادة تالية ، تزيد القيمة في هذا الملف بواحد. - نحن نقوم بتنسيق الرمز المميز لدينا باستخدام الأداة المساعدة rtAdmin ، والآن أصبح كل شيء جاهزًا لنشر المرجع المصدق.
خوارزمية الإجراء بسيطة على نطاق واسع:
أ) نصدر شهادة الجذر لمركز الشهادات باستخدام خوارزمية GOST:
- إنشاء مفتاح خاص لإصدار شهادة المرجع المصدق ذاتيًا
- إنشاء شهادة X509 موقعة ذاتيا باستخدام المفتاح الذي تم إنشاؤه
ب) على كل من الرموز USB
- إنشاء زوج مفاتيح (ما يسمى حاوية المفتاح الخاص)
- إنشاء طلب توقيع شهادة باستخدام مفتاح الرمز المميز الذي تم إنشاؤه
- اصدار شهادة لهذا الطلب
- حفظ الشهادة على الرمز المميز في حاوية المفتاح الخاص
التالي هو تطبيق هذه الخوارزمية لرمز واحد:
إنشاء مفتاح خاص لشهادة المرجع المصدق (نستخدم خوارزمية GOST):
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -outform PEM -out demoCA/private/cakey.pem
نصدر شهادة المرجع المصدق ذاتيا:
<b>openssl req -new -x509 -key demoCA/private/cakey.pem -out demoCA/certs/cacert.pem -extensions v3_ca -days +3650 -outform PEM
يرجى ملاحظة: أشرنا في سطر الأوامر إلى أنه من الضروري استخدام ملحقات v3_ca من config openssl_cnf. هناك هو أنه لدينا كاليفورنيا. صلاحية 10 سنوات. شيء شائع ل CA. لكن المزيد ممكن.
في عملية إصدار الشهادة ، سيطلب منك النظام إدخال قيم المعلمات الموجودة في قسم [req_distinguished_name] في ملف openssl.cnf الخاص بنا
الآن نبدأ العمليات الرمزية. إذا كان الرمز مميزًا جديدًا أو مهيأًا بقيم افتراضية ، فعندئذٍ يكون رقم PIN الخاص بالمستخدم 12345678. أتابع من الافتراض أن هذا الأمر صحيح تمامًا. بخلاف ذلك ، يجب عليك تحديد PIN الصحيح للمستخدم ومحاولة التأكد من أن أسماء الكائنات الموجودة بالفعل على الرمز المميز في الأمثلة أدناه لا تتداخل مع تلك التي تم إدخالها.
بادئ ذي بدء ، سنقوم بإنشاء زوج رئيسي. OpenSSL غير قادر على تنفيذ هذه العملية على Rutoken ، لذلك سنستخدم الأداة pkcs11-tool من حزمة OpenSC:
pkcs11-tool --module /path/to/your/librtpkcs11ecp.so --login --pin 12345678 --keypairgen --key-type GOSTR3410:A --id 303030303031 --label 'client01'
ملاحظة مهمة: حددنا المعرف 303030303031. كل رقمين من هذا المعرف ليس أكثر من رمز ASCII للحروف "0" و "1" ، على التوالي. للعمليات مع OpenSSL ، سيبدو "id = 000001"
توليد طلب شهادة:
openssl req -utf8 -new -keyform engine -key 'pkcs11:id=000001' -engine rtengine -out demoCA/newcerts/client01.csr
إذا تم كل شيء بشكل صحيح ، ثم النظام
- طلب رقم التعريف الشخصي
- سيطلب معلمات اسم الشهادة (من قسم [req_distinguished_name] )
- سيصدر ملف طلب توقيع شهادة
باستخدام هذا الطلب ، نوقع شهادة عميل ( في المثال ، الشهادة صالحة لمدة 1825 يومًا. من المهم ألا تتجاوز هذه الفترة فترة صلاحية شهادة الجذر الخاصة بك ):
openssl ca -utf8 -days +1825 -keyfile demoCA/private/cakey.pem -cert demoCA/certs/cacert.pem -in demoCA/newcerts/client01.csr -outdir demoCA/newcerts -out demoCA/certs/client01.pem
سيعرض النظام الشهادة ، ويسأل عن قرار التوقيع عليها (أجب عن "y") ، وعن قرار حفظ الشهادة الجديدة (أجب مرة أخرى "y").
نحفظ الشهادة المستلمة للرمز المميز:
pkcs11-tool --module /path/to/your/librtpkcs11ecp.so --login --pin 12345678 --id=303030303031 -w demoCA/certs/client01.pem -y cert
هذا كل شيء.
اختبار خلق "معجزة". للقيام بذلك ، نقوم بالتوقيع والتحقق من توقيع عبارة "مرحبًا أيها العالم!":
echo Hello,world! | openssl cms -nodetach -sign -signer demoCA/certs/client01.pem -keyform engine -inkey "pkcs11:id=000001" -engine rtengine -binary -noattr -outform PEM | openssl cms -verify -CAfile demoCA/certs/cacert.pem -inform PEM
إذا تم كل شيء بشكل صحيح ، سيطلب النظام رمز PIN ، ويوقع الرسالة ، ثم يتحقق من التوقيع ، وإذا نجح ، سيعرض الرسالة الأصلية ونتائج التحقق ("النجاح")
ملاحظة . بالعودة إلى مهمة العنوان والتوقيع باستخدام المكوّن الإضافي ، تجدر الإشارة إلى أن المكوّن الإضافي بشكل افتراضي يعطي نتيجة التوقيع ليس بتنسيق PEM ، ولكن بتنسيق DER المشفر في base64. لذلك ، للتحقق من التوقيع ، يجب عليك أولاً فك تشفير من base64 ، وعند التحقق من تحديد تنسيق DER الإدخال.
حظا سعيدا