
تقترب الساعة "H" بشكل لا يطاق: "لا يُسمح باستخدام مخطط توقيع GOST R 34.10-2001 لإنشاء توقيع بعد 31 ديسمبر 2018!".
ومع ذلك ، حدث خطأ ما ، فلم يكن الشخص مستعدًا ، وتم تمديد استخدام GOST R 34.10-2001 لعام 2019. ولكن فجأة هرع الجميع بنقل شهادة المرجع المصدق إلى GOST R 34.10-2012 ، ونقل المواطنين العاديين إلى شهادات جديدة. الناس لديهم عدة شهادات في أيديهم. عند التحقق من الشهادات أو التوقيعات الإلكترونية ، بدأت الأسئلة في الظهور ، ومكان الحصول على شهادات الجذر لتثبيت في متجر شهادات الجذر الموثوق بها.
ينطبق هذا على كل من مخازن الشهادات على Windows ومخازن الشهادات على Firefox و Google Chrome و GnuPG و LibreOffice وعملاء البريد الإلكتروني وحتى OpenSSL. بالطبع ، كان من الضروري الاهتمام بهذا عند استلام الشهادة في المرجع المصدق وكتابة سلسلة الشهادات إلى محرك أقراص فلاش USB. ومن ناحية أخرى ، لدينا مجتمع رقمي وفي أي وقت يجب أن تكون قادرة على الحصول على هذه السلسلة من الشبكة.
أظهر Simpleadmin كيفية القيام بذلك على صفحات هبر. ومع ذلك ، بالنسبة للمواطن العادي ، لا يزال الأمر صعبًا (خاصةً إذا كنت تأخذ في الاعتبار أن الغالبية العظمى منهم على نظام Windows): يجب أن يكون لديك نوع من openssl ، أداة جلب غير متوفرة لدي على جهاز الكمبيوتر الخاص بي ، ولا يعلم الجميع يمكنك استخدام wget بدلاً من ذلك. وكيف العديد من الإجراءات التي يتعين القيام بها. بالطبع هناك طريقة للخروج ، لكتابة نص ، ولكن ليس فقط نص برمجي فوق opensl وأمثاله ، ولكن معبأ في وحدة تنفيذية قائمة بذاتها لمختلف الأنظمة.
لم يكن هناك أدنى شك في ما
كتبه - في
Tcl و Python . ونبدأ مع Tcl
وهذا هو السبب :
* ويكي سخيف حيث توجد ألعاب (يمكنك رؤية أشياء مثيرة للاهتمام هناك :)
* ورقة الغش
* تصميمات tclkit العادية (1.5 - 2 ميجابايت كرسوم لمنصة مشتركة حقيقية)
* وجمع eTcl المفضل لدي من Evolane (محفوظ بعناية من الموقع المتوفى :(
احتفظ بتصنيف Tcl / Tk عالي في قائمة مجموعة أدواتي الشخصية
ونعم ، wiki.tcl.tk/16867 (خادم ويب صغير من cgi إلى Tcl ، يستخدم بشكل دوري مع ثبات تحسد عليه تحت tclkit)
وأيضًا هي جميلة وجميلة :)
أود أن أضيف إلى هذا مدى توفر الأداة المساعدة
freewrap ، والتي ستساعدنا في إنشاء أدوات مساعدة مستقلة لنظامي التشغيل Linux و MS Windows. نتيجة لذلك ، سيكون لدينا الأداة chainfromcert:
bash-4.3$ ./chainfromcert_linux64 Copyright(C)2019 Usage: chainfromcert <file with certificate> <directory for chain certificate> Bad usage! bash-4.3$
كمعلمات ، تقوم الأداة المساعدة بتعيين ملف مع شهادة مستخدم (بتنسيق PEM وتنسيق DER) والدليل الذي سيتم حفظ شهادات المرجع المصدق (CA) المضمنة في السلسلة:
bash-4.3$ ./chainfromcert_linux64 ./cert_test.der /tmp Loading file: cert_test.der Directory for chain: . cert 1 from http://ca.ekey.ru/cdp/ekeyUC2012.cer cert 2 from http://reestr-pki.ru/cdp/guc_gost12.crt Goodby! Length chain=2 Copyright(C) 2019 bash-4.3$
الآن النظر في كيفية عمل الأداة المساعدة.
يتم تخزين المعلومات حول المرجع المصدق الذي أصدر الشهادة للمستخدم في الملحق مع oid 1.3.6.1.5.5.7.1.1. يمكن لهذا الملحق أن يخزن موقع شهادة المرجع المصدق (المرجع نفسه 1.3.6.1.5.5.7.48.2) ومعلومات حول خدمة المرجع المصدق عليه (OCSP CA) (المرجع 1.3.6.1.5.5.7.48.1):

ويتم تخزين المعلومات ، على سبيل المثال ، حول فترة استخدام مفتاح التوقيع الإلكتروني في الامتداد باستخدام oid 2.5.29.16.
لتحليل الشهادة والوصول إلى ملحقات الشهادة ، سوف نستخدم حزمة pki:
#!/usr/bin/tclsh -f package require pki
سنحتاج أيضًا إلى الحزمة base64:
package require base64
حزمة pki ، وكذلك الحزمة asn وحزمة base64 التي يتم تحميلها ، ستساعدنا في تحويل الشهادات من ترميز PEM إلى تشفير DER ، وتحليل بنيات ASN والوصول فعليًا إلى المعلومات حول موقع شهادات المرجع المصدق (CA).
تبدأ الأداة المساعدة في التحقق من المعلمات وتنزيل الملف بالشهادة:
proc usage {use } { puts "Copyright(C) 2011-2019" if {$use == 1} { puts "Usage:\nchainfromcert <file with certificate> <directory for chain certificate>\n" } } if {[llength $argv] != 2 } { usage 1 puts "Bad usage!" exit } set file [lindex $argv 0] if {![file exists $file]} { puts "File $file not exist" usage 1 exit } puts "Loading file: $file" set dir [lindex $argv 1] if {![file exists $dir]} { puts "Dir $dir not exist" usage 1 exit } puts "Directory for chain: $dir" set fd [open $file] chan configure $fd -translation binary set data [read $fd] close $fd if {$data == "" } { puts "Bad file with certificate=$file" usage 1 exit }
كل شيء واضح هنا ونلاحظ شيئًا واحدًا فقط - يعتبر الملف الذي يحمل الشهادة ملفًا ثنائيًا:
chan configure $fd -translation binary
هذا يرجع إلى حقيقة أنه يمكن تخزين الشهادة بتنسيق DER (كود ثنائي) وفي تنسيق PEM (ترميز base64).
بعد تحميل الملف ، يسمى إجراء chainfromcert:
set depth [chainfromcert $data $dir]
الذي ينزل بالفعل شهادات الجذر:
proc chainfromcert {cert dir} { if {$cert == "" } { exit } set asndata [cert_to_der $cert] if {$asndata == "" } { # , return -1 } array set cert_parse [::pki::x509::parse_cert $asndata] array set extcert $cert_parse(extensions) if {![info exists extcert(1.3.6.1.5.5.7.1.1)]} { # return 0 } set a [lindex $extcert(1.3.6.1.5.5.7.1.1) 0] # if {$a == "false"} { # puts $a # } # ASN1- Hex- set b [lindex $extcert(1.3.6.1.5.5.7.1.1) 1] # set c [binary format H* $b] #Sequence 1.3.6.1.5.5.7.1.1 ::asn::asnGetSequence c c_par_first # 1.3.6.1.5.5.7.1.1 while {[string length $c_par_first] > 0 } { # (sequence) ::asn::asnGetSequence c_par_first c_par # oid ::asn::asnGetObjectIdentifier c_par c_type set tas1 [::pki::_oid_number_to_name $c_type] # ::asn::asnGetContext c_par c_par_two # oid if {$tas1 == "1.3.6.1.5.5.7.48.2" } { # set certca [readca $c_par $dir] if {$certca == ""} { # . continue } else { global count # set f [file join $dir [file tail $c_par]] set fd [open $fw] chan configure $fd -translation binary puts -nonewline $fd $certca close $fd incr count puts "cert $count from $c_par" # chainfromcert $certca $dir continue } } elseif {$tas1 == "1.3.6.1.5.5.7.48.1" } { # puts "OCSP server (oid=$tas1)=$c_par" } } # return $count }
لا يوجد شيء يمكن إضافته إلى التعليقات ، لكننا لم نفكر بعد في إجراء readca:
proc readca {url dir} { set cer "" # if {[catch {set token [http::geturl $url -binary 1] # set ere [http::status $token] if {$ere == "ok"} { # set code [http::ncode $token] if {$code == 200} { # set cer [http::data $token] } elseif {$code == 301 || $code == 302} { # , set newURL [dict get [http::meta $token] Location] # set cer [readca $newURL $dir] } else { # set cer "" } } } error]} { # , set cer "" } return $cer }
يعتمد هذا الإجراء على استخدام حزمة http:
package require http
لقراءة الشهادة ، نستخدم الوظيفة التالية:
set token [http::geturl $url -binary 1]
الغرض من الوظائف المتبقية المستخدمة واضح من التعليقات. سنقدم فقط فك تشفير رموز الإرجاع للدالة http :: ncodel:
200 طلب مكتمل بنجاح
206 تم إكمال الطلب بنجاح ، ولكن تم تنزيل جزء فقط من الملف
تم نقل الملف 301 إلى موقع آخر.
302 تم نقل الملف مؤقتًا إلى موقع آخر.
مصادقة خادم 401 المطلوبة
403 تم رفض الوصول إلى هذا المورد
404 لا يمكن العثور على المورد المحدد.
500 خطأ داخلي
لا يزال هناك إجراء واحد يجب مراعاته ، وهو cert_to_der:
proc cert_to_der {data} { set lines [split $data \n] set hlines 0 set total 0 set first 0 # PEM- foreach line $lines { incr total if {[regexp {^-----BEGIN CERTIFICATE-----$} $line]} { if {$first} { incr total -1 break } else { set first 1 incr hlines } } if {[regexp {^(.*):(.*)$} $line ]} { incr hlines } } if { $first == 0 && [string range $data 0 0 ] == "0" } { # DER- "0" == 0x30 return $data } if {$first == 0} {return ""} set block [join [lrange $lines $hlines [expr {$total-1}]]] #from PEM to DER set asnblock [base64::decode $block] return $asnblock }
الإجراء بسيط جدا. إذا كان هذا ملف PEM مع شهادة ("----- BEGIN CERTIFICATE -----") ، فسيتم تحديد نص هذا الملف وتحويله إلى رمز binar:
set asnblock [base64::decode $block]
إذا لم يكن هذا ملف PEM ، فيتم تحديد هذا "التشابه" مع الترميز asn (يجب أن تكون قيمة البتة صفر 0x30).
هذا كل شيء ، يبقى لإضافة الخطوط النهائية:
if {$depth == -1} { puts "Bad file with certificate=$file" usage 1 exit } puts "Goodby!\nLength chain=$depth" usage 0 exit
الآن نجمع كل شيء في ملف واحد بالاسم
chainfromcert.tcl #!/usr/bin/tclsh encoding system utf-8 package require pki package require base64 #package require asn package require http global count set count 0 proc chainfromcert {cert dir} { if {$cert == "" } { exit } set asndata [cert_to_der $cert] if {$asndata == "" } { # , return -1 } array set cert_parse [::pki::x509::parse_cert $asndata] array set extcert $cert_parse(extensions) if {![info exists extcert(1.3.6.1.5.5.7.1.1)]} { # return 0 } set a [lindex $extcert(1.3.6.1.5.5.7.1.1) 0] # if {$a == "false"} { # puts $a # } # ASN1- Hex- set b [lindex $extcert(1.3.6.1.5.5.7.1.1) 1] # set c [binary format H* $b] #Sequence 1.3.6.1.5.5.7.1.1 ::asn::asnGetSequence c c_par_first # 1.3.6.1.5.5.7.1.1 while {[string length $c_par_first] > 0 } { # (sequence) ::asn::asnGetSequence c_par_first c_par # oid ::asn::asnGetObjectIdentifier c_par c_type set tas1 [::pki::_oid_number_to_name $c_type] # ::asn::asnGetContext c_par c_par_two # oid if {$tas1 == "1.3.6.1.5.5.7.48.2" } { # set certca [readca $c_par $dir] if {$certca == ""} { # . continue } else { global count # set f [file join $dir [file tail $c_par]] set fd [open $fw] chan configure $fd -translation binary puts -nonewline $fd $certca close $fd incr count puts "cert $count from $c_par" # chainfromcert $certca $dir continue } } elseif {$tas1 == "1.3.6.1.5.5.7.48.1" } { # puts "OCSP server (oid=$tas1)=$c_par" } } # return $count } proc readca {url dir} { set cer "" # if {[catch {set token [http::geturl $url -binary 1] # set ere [http::status $token] if {$ere == "ok"} { # set code [http::ncode $token] if {$code == 200} { # set cer [http::data $token] } elseif {$code == 301 || $code == 302} { # , set newURL [dict get [http::meta $token] Location] # set cer [readca $newURL $dir] } else { # set cer "" } } } error]} { # , set cer "" } return $cer } proc cert_to_der {data} { set lines [split $data \n] set hlines 0 set total 0 set first 0 # PEM- foreach line $lines { incr total # if {[regexp {^-----(.*?)-----$} $line]} {} if {[regexp {^-----BEGIN CERTIFICATE-----$} $line]} { if {$first} { incr total -1 break } else { set first 1 incr hlines } } if {[regexp {^(.*):(.*)$} $line ]} { incr hlines } } if { $first == 0 && [string range $data 0 0 ] == "0" } { # DER- "0" == 0x30 return $data } if {$first == 0} {return ""} set block [join [lrange $lines $hlines [expr {$total-1}]]] #from PEM to DER set asnblock [base64::decode $block] return $asnblock } proc usage {use } { puts "Copyright(C) Orlov Vladimir 2011-2019" if {$use == 1} { puts "Usage:\nchainfromcert <file with certificate> <directory for chain certificate>\n" } } if {[llength $argv] != 2 } { usage 1 puts "Bad usage!" exit } set file [lindex $argv 0] if {![file exists $file]} { puts "File $file not exist" usage 1 exit } puts "Loading file: $file" set dir [lindex $argv 1] if {![file exists $dir]} { puts "Dir $dir not exist" usage 1 exit } puts "Directory for chain: $dir" set fd [open $file] chan configure $fd -translation binary set data [read $fd] close $fd if {$data == "" } { puts "Bad file with certificate=$file" usage 1 exit } set depth [chainfromcert $data $dir] if {$depth == -1} { puts "Bad file with certificate=$file" usage 1 exit } puts "Goodby!\nLength chain=$depth" usage 0 exit
يمكنك التحقق من تشغيل هذا الملف باستخدام مترجم tclsh:
$ tclsh ./chainfromcert.tcl cert_orlov.der /tmp Loading file: cert_test.der Directory for chain: /tmp cert 1 from http://ca.ekey.ru/cdp/ekeyUC2012.cer cert 2 from http://reestr-pki.ru/cdp/guc_gost12.crt Goodby! Length chain=2 Copyright(C) 2019 $
نتيجة لذلك ، حصلنا على سلسلة من شهادتين في دليل / tmp.
لكننا أردنا الحصول على وحدات قابلة للتنفيذ لأنظمة التشغيل Linux و Windows ومن ثم لا يفكر المستخدمون في أي مترجمين فوريين.
لهذا الغرض ، سوف نستخدم الأداة المساعدة
freewrapTCLSH . باستخدام هذه الأداة المساعدة ، سنقوم بإنشاء وحدات قابلة للتنفيذ من الأداة لدينا لأنظمة التشغيل Linux و Windows ، 32 بت و 64 بت. يمكن بناء الأدوات المساعدة لجميع المنصات على أي منصة. آسف لالحلى. سأبني على linux_x86_64 (Mageia).
لبناء ، سوف تحتاج إلى:
1. الأداة المساعدة freewrapTCLSH لنظام التشغيل linux_x86_64 ؛
2. ملف freewrapTCLSH مع هذه الأداة المساعدة لكل منصة:
- freewrapTCLSH_linux32
- freewrapTCLSH_linux64
- freewrapTCLSH_win32
- freewrapTCLSH_win64
3. الملف المصدر لفائدتنا: chainfromcert.tcl
لذلك ، فإن chainfromcerty_linuxx86 المجمعة قابلة للتنفيذ لمنصة Linux x86:
$freewrapTCLSH chainfromcert.tcl –w freewrapTCLSH_linux32 –o chainfromcerty_linuxx86 $
يبدو تجميع الأداة المساعدة لنظام التشغيل Windows 64 بت كما يلي:
$freewrapTCLSH chainfromcert.tcl –w freewrapTCLSH_win64 –o chainfromcerty_win64.exe $
الخ. المرافق جاهزة للاستخدام. لقد استوعبت كل ما هو ضروري لعملهم.
يتم كتابة الكود بنفس الطريقة في بيثون.
في الأيام المقبلة ، أفكر في استكمال حزمة
fsb795 (التي تتم كتابتها في Python) بوظيفة الحصول على سلسلة شهادات الجذر.