استخدام آليات الرمز المميز للتشفير PKCS # 11 في لغات البرمجة النصية

في تعليقاته على مقالة "أداة مساعدة مشتركة عبر اللغة الإنجليزية لعرض شهادات x509 المؤهلة باللغة الروسية" ، لاحظ المستخدم Pas بشكل صحيح للغاية الرموز PKCS # 11 التي "يستطيعون حسابها". نعم ، الرموز هي في الواقع أجهزة تشفير. ومن الطبيعي أن ترغب في استخدام هذه الحواسيب في لغات البرمجة النصية ، سواء كانت بيثون أو بيرل أو روبي. لقد درسنا بالفعل بطريقة ما استخدام الرموز PKCS # 11 مع دعم للتشفير الروسي في Python لتوقيع المستندات وتشفيرها ، لإنشاء طلب شهادة:

صورة

هنا نواصل النقاش حول لغة Tcl. في المقالة السابقة ، عندما نظرنا إلى عرض والتحقق من صحة الشهادات المخزنة على الرموز PKCS # 11 / البطاقات الذكية ، استخدمنا حزمة الإصدار 0.9.9 TclPKCS11 للوصول إليها (الشهادات). كما لوحظ بالفعل ، لسوء الحظ ، تم تطوير الحزمة لتشفير RSA مع مراعاة معيار PKCS # 11 v.2.20. اليوم ، يتم استخدام PKCS # 11 v.2.40 القياسي بالفعل وهي اللجنة الفنية للتشفير TK-26 التي تسترشد بها ، وتصدر توصيات للشركات المصنعة المحلية للرموز / البطاقات الذكية التي تدعم التشفير الروسي. ومع كل ما قيل ، ظهرت حزمة جديدة TclPKCS11 الإصدار 1.0.1 . سنقوم بالحجز على الفور بحفظ جميع واجهات التشفير الخاصة بـ RSA في الإصدار الجديد من حزمة TclPKCS11 v.10.1. مكتبة الحزمة مكتوبة بلغة C.

إذن ، ما الجديد في الحزمة؟ بادئ ذي بدء ، تمت إضافة أمر يتيح لك الحصول على قائمة بآليات التشفير التي يدعمها الرمز المميز المتصل:

::pki::pkcs11::listmechs <handl> <slotid> 

يتم عرض كيفية الحصول على قائمة بالفتحات التي تحتوي على الرموز المميزة هنا (الإجراء - proc :: slots_with_token):

 proc ::slots_with_token {handle} { set slots [pki::pkcs11::listslots $handle] # puts "Slots: $slots" array set listtok [] foreach slotinfo $slots { set slotid [lindex $slotinfo 0] set slotlabel [lindex $slotinfo 1] set slotflags [lindex $slotinfo 2] if {[lsearch -exact $slotflags TOKEN_PRESENT] != -1} { set listtok($slotid) $slotlabel } } #     parray listtok return [array get listtok] } 

خذ برنامج نصي بسيط:

 #!/usr/bin/tclsh lappend auto_path . package require pki::pkcs11 #      RuToken set lib "/usr/local/lib64/librtpkcs11ecp_2.0.so" <source lang="bash">set handle [pki::pkcs11::loadmodule $lib] #    #       set labslot [::slots_with_token $handle] if {[llength $labslot] == 0} { puts "     " exit } set slotid 0 set lmech [pki::pkcs11::listmechs $handle $slotid] set i 0 foreach mm $lmech { #   if {[string first "GOSTR3410" $mm] != -1} { puts -nonewline "[lindex $mm 0] " if {$i == 2} {puts "";set i 0} else { incr i} } } puts "\n" exit 

يتيح لك هذا البرنامج النصي الحصول على قائمة بآليات تشفير GOSTR3410 المدعومة على رموز عائلة RuToken. للبدء ، دعنا نأخذ ، كما كتب Pas في المقال ، "Rutoken Light المحبوب بجميع أنواع EDOs":

 $ tclsh TEST_for_HABR.tcl listtok(0) = ruToken Lite 0 {ruToken Lite } $ 

وبطبيعة الحال اتضح أنه لا يدعم أي mezaism غوست ، والتي كان لا بد من إثباتها. نأخذ رمزية أخرى Rutoken EDS:

 $ tclsh TEST_for_HABR.tcl listtok(0) = ruToken ECP } 0 {ruToken ECP } CKM_GOSTR3410_KEY_PAIR_GEN CKM_GOSTR3410 CKM_GOSTR3410_DERIVE CKM_GOSTR3410_WITH_GOSTR3411 $ 

نعم ، هذا الرمز المميز يدعم التشفير الروسي ، ولكن فقط توقيع GOST R 34.10-2001 ، والذي يكاد يكون غير مستخدم . ولكن إذا أخذت الرمز المميز Rutoken EDS-2.0 ، فسيكون كل شيء على ما يرام ، فهو يدعم GOST R 34.10-2012 مع مفاتيح 256 و 512 بت:

 $ tclsh TEST_for_HABR.tcl listtok(0) = RuTokenECP20 0 {RuTokenECP20 } CKM_GOSTR3410_KEY_PAIR_GEN CKM_GOSTR3410 CKM_GOSTR3410_DERIVE CKM_GOSTR3410_512_KEY_PAIR_GEN CKM_GOSTR3410_512 CKM_GOSTR3410_12_DERIVE CKM_GOSTR3410_WITH_GOSTR3411 CKM_GOSTR3410_WITH_GOSTR3411_12_256 CKM_GOS TR3410_WITH_GOSTR3411_12_512 $ 

إذا تحدثنا عن دعم التشفير الروسي ، بما في ذلك خوارزميات تشفير grasshopper و magma ، برمز واحد أو آخر ، فسيكون مدعومًا تمامًا بواسطة البرامج والرموز المميزة السحابية ، وهذا أمر طبيعي:

 $ tclsh TEST_for_HABR.tcl listtok(0) = LS11SW2016_LIN_64 0 {LS11SW2016_LIN_64 } 

قائمة الآليات
CKM_GOSTR3410_KEY_PAIR_GEN
CKM_GOSTR3410_512_KEY_PAIR_GEN
CKM_GOSTR3410
CKM_GOSTR3410_512
CKM_GOSTR3410_WITH_GOSTR3411
CKM_GOSTR3410_WITH_GOSTR3411_12_256
CKM_GOSTR3410_WITH_GOSTR3411_12_512
CKM_GOSTR3410_DERIVE
CKM_GOSTR3410_12_DERIVE
CKM_GOSR3410_2012_VKO_256
CKM_GOSR3410_2012_VKO_512
CKM_KDF_4357
CKM_KDF_GOSTR3411_2012_256
CKM_KDF_TREE_GOSTR3411_2012_256
CKM_GOSTR3410_KEY_WRAP
CKM_GOSTR3410_PUBLIC_KEY_DERIVE
CKM_LISSI_GOSTR3410_PUBLIC_KEY_DERIVE
CKM_GOST_GENERIC_SECRET_KEY_GEN
CKM_GOST_CIPHER_KEY_GEN
CKM_GOST_CIPHER_ECB
CKM_GOST_CIPHER_CBC
CKM_GOST_CIPHER_CTR
CKM_GOST_CIPHER_OFB
CKM_GOST_CIPHER_CFB
CKM_GOST_CIPHER_OMAC
CKM_GOST_CIPHER_KEY_WRAP
CKM_GOST_CIPHER_ACPKM_CTR
CKM_GOST_CIPHER_ACPKM_OMAC
CKM_GOST28147_KEY_GEN
CKM_GOST28147
CKM_GOST28147_KEY_WRAP
CKM_GOST28147_PKCS8_KEY_WRAP
CKM_GOST_CIPHER_PKCS8_KEY_WRAP
CKM_GOST28147_ECB
CKM_GOST28147_CNT
CKM_GOST28147_MAC
CKM_KUZNYECHIK_KEY_GEN
CKM_KUZNYECHIK_ECB
CKM_KUZNYECHIK_CBC
CKM_KUZNYECHIK_CTR
CKM_KUZNYECHIK_OFB
CKM_KUZNYECHIK_CFB
CKM_KUZNYECHIK_OMAC
CKM_KUZNYECHIK_KEY_WRAP
CKM_KUZNYECHIK_ACPKM_CTR
CKM_KUZNYECHIK_ACPKM_OMAC
CKM_MAGMA_KEY_GEN
CKM_MAGMA_ECB
CKM_MAGMA_CBC
CKM_MAGMA_CTR
CKM_MAGMA_OFB
CKM_MAGMA_CFB
CKM_MAGMA_OMAC
CKM_MAGMA_KEY_WRAP
CKM_MAGMA_ACPKM_CTR
CKM_MAGMA_ACPKM_OMAC
CKM_GOSTR3411
CKM_GOSTR3411_12_256
CKM_GOSTR3411_12_512
CKM_GOSTR3411_HMAC
CKM_GOSTR3411_12_256_HMAC
CKM_GOSTR3411_12_512_HMAC
CKM_PKCS5_PBKD2
CKM_PBA_GOSTR3411_WITH_GOSTR3411_HMAC
CKM_TLS_GOST_KEY_AND_MAC_DERIVE
CKM_TLS_GOST_PRE_MASTER_KEY_GEN
CKM_TLS_GOST_MASTER_KEY_DERIVE
CKM_TLS_GOST_PRF
CKM_TLS_GOST_PRF_2012_256
CKM_TLS_GOST_PRF_2012_512
CKM_TLS12_MASTER_KEY_DERIVE
CKM_TLS12_KEY_AND_MAC_DERIVE
CKM_TLS_MAC
CKM_TLS_KDF
CKM_TLS_TREE_GOSTR3411_2012_256
CKM_EXTRACT_KEY_FROM_KEY
CKM_SHA_1
CKM_MD5

 $ 

ننتقل إلى الميزة الجديدة التالية المضافة إلى الحزمة:

 set listcertsder [pki::pkcs11::listcertsder $handle $slotid] 

هذه الدالة تقوم بإرجاع قائمة الشهادات المخزنة بواسطة لا رمز. السؤال الذي يطرح نفسه طبيعيًا ، ولكن كيف يختلف عن الوظيفة الحالية pki :: pkcs11 :: listcerts؟

بادئ ذي بدء ، لا تستخدم الوظيفة الجديدة الحزمة :: pki. أحد العناصر التي تم إرجاعها هو عنصر cert_der ، الذي يحتوي على الشهادة الكاملة. هذا مناسب ، على سبيل المثال ، عند تصدير شهادة ، أو تلقي بصمتها. في السابق ، كان علي جمع الشهادة الكاملة من شهادة tbs وتوقيعها. تظهر قائمة كاملة بالعناصر التي يتم إرجاعها لكل شهادة بوضوح عند طباعة محتويات شهادة واحدة:

 . . . array set derc [[pki::pkcs11::listcertsder $handle $slotid] 0] parray derc derc(cert_der) = 3082064a … derc(pkcs11_handle) = pkcsmod0 derc(pkcs11_id) = 5882d64386211cf3a8367d2f87659f9330e5605d derc(pkcs11_label) = Thenderbird-60   derc(pkcs11_slotid) = 0 derc(type) = pkcs11 . . . 

يخزن العنصر pkcs11_id سمة CKA_ID قيمة تجزئة SHA-1 من المفتاح العمومي. عنصر cert_der هو شهادة CKA_VALUE ، pkcs11_label هو CKA_LABEL.

العنصر pkcs11_id (CKA_ID في المصطلحات الخاصة بالمعيار PKCS # 11) هو ، جنبًا إلى جنب مع مكتبة pkcs11_handle ، ومعرف الفتحة مع pkcs11_slotid الرمز المميز عنصر رئيسي للوصول إلى المفاتيح والشهادات المخزنة على الرموز.

لذلك ، إذا كنا نريد تغيير تسمية (pkcs11_label) الشهادة أو المفاتيح ، فنحن ننفذ أمر النموذج:

 pki::pkcs11::rname <cert|key|all> <  > 

لإزالة شهادة أو مفاتيح من رمز مميز ، يتم تنفيذ أمر من النموذج:

 pki::pkcs11::delete <cert|key|all> <  > 

يمكن تشكيل قائمة العناصر الرئيسية على النحو التالي:

 set listparam {} lappend listparam pkcs11_handle lappend listparam $handle lappend listparam pkcs11_slotid lappend listparam $pkcs11_slotid lappend listparam pkcs11_id lappend listparam $pkcs11_id 

إلخ
يشبه استدعاء الوظيفة في هذه الحالة (سنحذف الشهادة والمفاتيح المرتبطة بها):

 pki::pkcs11::delete all $listparam 

ربما خمن القارئ بالفعل أن هذه القائمة يمكن ترتيبها كقاموس إملاء:

 set listparam [dict create pkcs11_handle $pkcs11_handle] dict set listparam pkcs11_slotid $pkcs11_slotid) dict set listparam pkcs11_id $pkcs11_id 

هناك طرق أخرى ، على سبيل المثال ، من خلال مجموعة.

مرة أخرى ، نلاحظ أن عنصري pkcs11_handle و pkcs11_slotid يجب أن يكونا موجودين دائمًا في قائمة العناصر الأساسية ، التي تحدد الرمز المميز المتصل بشكل فريد. يتم تحديد بقية التكوين بواسطة وظيفة محددة.

تُستخدم الوظيفة التالية لتثبيت الشهادة على الرمز المميز:

 set pkcs11_id_cert [::pki::pkcs11::importcert <cert_der_hex> <  > 

ترجع الدالة القيمة CKA_ID بالسداسي عشري. تحدد قائمة المعلمات الأساسية الرمز المميز الذي سيتم تحديد موقع الشهادة عليه:

 {pkcs11_handle <handle> pkcs11_slotid <slotid>} 

يصل المقبل هو حساب التجزئة لدينا. في التشفير الروسي اليوم تستخدم ثلاثة أنواع من وظائف التجزئة:
- GOST R 34.11-94
- GOST R 34 .11-2012 بقيمة تجزئة تبلغ 256 بت (stribog256)
- GOST R 34 .11-2012 بقيمة تجزئة 512 بت (stribog512)
لتحديد التجزئة التي تدعم الرمز المميز ، لدينا الدالة pki :: pkcs11 :: listmechs.

دالة حساب التجزئة لها النموذج التالي:

 set <> [pki::pkcs11::digest <gostr3411|stribog256|stribog512|sha1> <  > <  >] 

لاحظ أنه يتم تقديم نتيجة الحساب في الست عشري:
 . . . set listparam [dict create pkcs11_handle $pkcs11_handle] dict set listparam pkcs11_slotid $pkcs11_slotid set res_hex [pki::pkcs11::digest stribog256 0123456789 $listparam] puts $res_hex 086f2776f33aae96b9a616416b9d1fe9a049951d766709dbe00888852c9cc021 

للتحقق ، دعونا نلقي openssl بدعم من التشفير الروسي :

 $ echo -n "0123456789"|/usr/local/lirssl_csp_64/bin/lirssl_s tatic dgst -md_gost12_256 (stdin)= 086f2776f33aae96b9a616416b9d1fe9a0499 51d766709dbe00888852c9 cc021 $ 

كما ترون ، النتيجة متطابقة.

للتحقق من التوقيع الإلكتروني ، سواء كان شهادة أو قائمة بالشهادات الملغاة أو وثيقة موقعة بتنسيق ، نحن الآن بحاجة فقط إلى وظيفة التحقق من التوقيع:

 set result [pki::pkcs11::verify < > < > <  >]] 

إذا نجح التوقيع في التحقق ، فسيتم إرجاع 1 ؛ وإلا ، 0. للتحقق من التوقيع الإلكتروني ، يلزم توقيع المستند نفسه وتجزئة المستند ، والمحددة حسب نوع التوقيع والمفتاح العمومي الذي تم إنشاء التوقيع به ، مع كل المعلمات (القيمة والنوع والمعلمات). . يجب إدراج جميع المعلومات حول المفتاح في شكل publickeyinfo asn1 في قائمة العناصر الأساسية:
lpkar (pkcs11_handle) = pkcsmod0
lpkar (pkcs11_slotid) = 0
lpkar (pubkeyinfo) = 301f06082a85030701010101301306072a85030202240
006082a8503070101020203430004407d9306687af5a8e63af4b09443ed2e03794be
10eba6627bf5fb3da1bb474a3507d2ce2cd24b63c727a02521897d1dd6edbdc7084d
8886a39289c3f81bdf2e179
هيكل المفتاح العمومي ASN1 مأخوذ من الشهادة الموقعة:

 proc ::pki::x509::parse_cert_pubkeyinfo {cert_hex} { array set ret [list] set wholething [binary format H* $cert_hex] ::asn::asnGetSequence wholething cert ::asn::asnPeekByte cert peek_tag if {$peek_tag != 0x02} { # Version number is optional, if missing assumed to be value of 0 ::asn::asnGetContext cert - asn_version ::asn::asnGetInteger asn_version ret(version) } ::asn::asnGetBigInteger cert ret(serial_number) ::asn::asnGetSequence cert data_signature_algo_seq ::asn::asnGetObjectIdentifier data_signature_algo_seq ret(data_signature_algo) ::asn::asnGetSequence cert issuer ::asn::asnGetSequence cert validity ::asn::asnGetUTCTime validity ret(notBefore) ::asn::asnGetUTCTime validity ret(notAfter) ::asn::asnGetSequence cert subject ::asn::asnGetSequence cert pubkeyinfo binary scan $pubkeyinfo H* ret(pubkeyinfo) return $ret(pubkeyinfo) } 

يوجد نص البرنامج النصي للتحقق من التوقيع الإلكتروني للشهادات من ملف
هنا
 #! /usr/bin/env tclsh package require pki lappend auto_path . package require pki::pkcs11 #     PKCS#11 #set pkcs11_module "/usr/local/lib/libcackey.so" #set pkcs11_module "/usr/local/lib64/librtpkcs11ecp_2.0.so" set pkcs11_module "/usr/local/lib64/libls11sw2016.so" puts "Connect the Token and press Enter" gets stdin yes set handle [pki::pkcs11::loadmodule $pkcs11_module] set slots [pki::pkcs11::listslots $handle] foreach slotinfo $slots { set slotid [lindex $slotinfo 0] set slotlabel [lindex $slotinfo 1] set slotflags [lindex $slotinfo 2] if {[lsearch -exact $slotflags TOKEN_PRESENT] != -1} { set token_slotlabel $slotlabel set token_slotid $slotid #    break } } # PEM  DER proc ::cert_to_der {data} { if {[string first "-----BEGIN CERTIFICATE-----" $data] != -1} { set data [string map {"\r\n" "\n"} $data] } array set parsed_cert [::pki::_parse_pem $data "-----BEGIN CERTIFICATE-----" "-----END CERTIFICATE-----"] if {[string range $parsed_cert(data) 0 0 ] == "0" } { #   DER- "0" == 0x30 set asnblock $parsed_cert(data) } else { set asnblock "" } return $asnblock } proc usage {use error} { puts "Copyright(C) Orlov Vladimir (http://soft.lissi.ru) 2019" if {$use == 1} { puts $error puts "Usage:\nverify_cert_with_pkcs11 <file with certificate> \[<file with CA certificate>\]\n" } } set countcert [llength $argv] if { $countcert < 1 || $countcert > 2 } { usage 1 "Bad usage!" exit } set file [lindex $argv 0] if {![file exists $file]} { usage 1 "File $file not exist" exit } #  cert_user puts "Loading user certificate: $file" set fd [open $file] chan configure $fd -translation binary set cert_user [read $fd] close $fd if {$cert_user == "" } { usage 1 "Bad file with certificate user: $file" exit } set cert_user [cert_to_der $cert_user] if {$cert_user == ""} { puts "User certificate bad" exit } catch {array set cert_parse [::pki::x509::parse_cert $cert_user]} if {![info exists cert_parse]} { puts "User certificate bad" exit } #parray cert_parse if {$countcert == 1} { if {$cert_parse(issuer) != $cert_parse(subject)} { puts "Bad usage: not self signed certificate" } else { set cert_CA $cert_user } } else { set fileca [lindex $argv 1] if {![file exists $fileca]} { usage 1 "File $fileca not exist" exit } #  cert_CA puts "Loading CA certificate: $fileca" set fd [open $fileca] chan configure $fd -translation binary set cert_CA [read $fd] close $fd if {$cert_CA == "" } { usage 1 "Bad file with certificate CA=$fileca" exit } set cert_CA [cert_to_der $cert_CA] if {$cert_CA == ""} { puts "CA certificate bad" exit } } foreach slotinfo $slots { set slotid [lindex $slotinfo 0] set slotlabel [lindex $slotinfo 1] set slotflags [lindex $slotinfo 2] if {[lsearch -exact $slotflags TOKEN_PRESENT] != -1} { set token_slotlabel $slotlabel set token_slotid $slotid } } #    #array set cert_parse_CA [::pki::x509::parse_cert $cert_CA] catch {array set cert_parse_CA [::pki::x509::parse_cert $cert_CA]} #array set cert_parse_CA [::pki::x509::parse_cert $cert_CA_256] #array set cert_parse_CA [::pki::x509::parse_cert $CA_12_512] if {![info exists cert_parse_CA]} { puts "CA certificate bad" exit } ############################### set aa [dict create pkcs11_handle $handle pkcs11_slotid $token_slotid] set tbs_cert [binary format H* $cert_parse(cert)] #puts "SIGN_ALGO1=$cert_parse(signature_algo)" catch {set signature_algo_number [::pki::_oid_name_to_number $cert_parse(signature_algo)]} if {![info exists signature_algo_number]} { set signature_algo_number $cert_parse(signature_algo) } #puts "SIGN_ALGO=$signature_algo_number" switch -- $signature_algo_number { "1.2.643.2.2.3" - "1 2 643 2 2 3" { # "GOST R 34.10-2001 with GOST R 34.11-94" set digest_algo "gostr3411" } "1.2.643.7.1.1.3.2" - "1 2 643 7 1 1 3 2" { # "GOST R 34.10-2012-256 with GOSTR 34.11-2012-256" set digest_algo "stribog256" } "1.2.643.7.1.1.3.3" - "1 2 643 7 1 1 3 3" { # "GOST R 34.10-2012-512 with GOSTR 34.11-2012-512" set digest_algo "stribog512" } default { puts "  :$signature_algo_number" exit } } #   tbs-!!!! set digest_hex [pki::pkcs11::digest $digest_algo $tbs_cert $aa] puts "digest_hex=$digest_hex" puts [string length $digest_hex] # asn-   #    binary scan $cert_CA H* cert_CA_hex array set infopk [pki::pkcs11::pubkeyinfo $cert_CA_hex [list pkcs11_handle $handle pkcs11_slotid $token_slotid]] parray infopk set lpk [dict create pkcs11_handle $handle pkcs11_slotid $token_slotid] # pybkeyinfo     lappend lpk "pubkeyinfo" #lappend lpk $pubinfo lappend lpk $infopk(pubkeyinfo) array set lpkar $lpk parray lpkar puts "Enter PIN user for you token \"$token_slotlabel\":" #set password "01234567" gets stdin password if { [pki::pkcs11::login $handle $token_slotid $password] == 0 } { puts "Bad password" exit } if {[catch {set verify [pki::pkcs11::verify $digest_hex $cert_parse(signature) $lpk]} res] } { puts $res exit } if {$verify != 1} { puts "BAD SIGNATURE=$verify" } else { puts "SIGNATURE OK=$verify" } puts "!" exit 


احفظ البرنامج النصي في ملف وحاول تنفيذه:

 $./verify_cert_with_pkcs11.tcl Copyright(C) Orlov Vladimir (http://museum.lissi-crypto.ru/) Usage: verify_cert_with_pkcs11 <file with certificate> <file with CA certificate> $ 

يتساءل المرء ، ماذا عن الشهادات الموجودة على الرمز المميز؟ أولاً ، قمنا بحل مشكلة استخدام آلات التشفير PKCS # 11. استخدمناهم. ولإرسال شهادة برمز ، توجد وظيفة حزمة pki :: pkcs11 :: listcertsder ، والتي تتيح لك تحديد الشهادة المطلوبة والتحقق منها. هذا يمكن اعتباره واجب منزلي.

سمح ظهور الإصدار الجديد من حزمة TclPKCS11v.1.0.1 بتحسين أداة عرض الشهادة عن طريق إضافة وظائف استيراد شهادة لرمز مميز وحذف الشهادات والمفاتيح المرتبطة بها من رمز مميز وتغيير ملصقات الشهادات والمفاتيح وما إلى ذلك:



أهم ميزة تمت إضافتها هي التحقق من التوقيع الرقمي للشهادة:



لاحظ القارئ اليقظ بشكل صحيح أنه لم يتم قول أي شيء عن جيل زوج المفاتيح. تتم إضافة هذه الميزة أيضًا إلى الحزمة TclPKCS11:

 array set genkey [pki::pkcs11::keypair < > <> <  >] 

كيفية استخدام وظائف حزمة TclPKCS11 ، بالطبع ، يمكن العثور عليها في الكود المصدري للأداة.

ستتم مناقشة وظيفة إنشاء زوج مفاتيح بالتفصيل في المقالة التالية ، عندما تقوم الأداة المساعدة بإنشاء طلب لشهادة مؤهلة مع إنشاء زوج مفاتيح على رمز PKCS # 11 ، وآلية الحصول على شهادة في مركز إصدار الشهادات ( CA ) واستيرادها في رمز مميز:



في المادة نفسها ، سيتم النظر في وظيفة توقيع وثيقة. هذا سيكون المقال الأخير في هذه السلسلة. بعد ذلك ، تم التخطيط لسلسلة من المقالات حول دعم التشفير باللغة الروسية في لغة البرمجة النصية لـ Ruby ، ​​والتي أصبحت الآن على الموضة. اراك قريبا!

Source: https://habr.com/ru/post/ar449462/


All Articles