
рдШрдВрдЯреЗ "рдПрдЪ" рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ: "31 рджрд┐рд╕рдВрдмрд░, 2018 рдХреЗ рдмрд╛рдж рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП GOST R 34.10-2001 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ!"ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдлрд┐рд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛, рдХреЛрдИ рддреИрдпрд╛рд░ рдирд╣реАрдВ рдерд╛, рдФрд░ 2019 рдХреЗ рд▓рд┐рдП GOST R 34.10-2001 рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рд╣рд░ рдХреЛрдИ рд╕реАрдП рдХреЛ GOST R 34.10-2012 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЖрдо рдирд╛рдЧрд░рд┐рдХреЛрдВ рдХреЛ рдирдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝рд╛ред рд▓реЛрдЧреЛрдВ рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдХрдИ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реИрдВред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдпрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп, рд╕рд╡рд╛рд▓ рдЙрдардиреЗ рд▓рдЧреЗ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рджреБрдХрд╛рди рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдпрд╣ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ Google Chrome, GnuPG, LibreOffice, рдИрдореЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕реНрдЯреЛрд░ рдкрд░ рджреЛрдиреЛрдВ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕реНрдЯреЛрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╕реАрдП рдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдпреВрдПрд╕рдмреА рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рджреВрд╕рд░реА рддрд░рдл, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рд╕рдорд╛рдЬ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд┐рдВрдкрд▓рдбрдорд┐рди рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ
рд╣реИрдмрд░ рдХреЗ рдкрдиреНрдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдЧрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╣реИрдВ): рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдУрдкрдирд╕реНрд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХреА рдЧрдИ рдПрдХ рд╕реБрд╡рд┐рдзрд╛, рдФрд░ рд╣рд░ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк wget рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдХрд┐рддрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВ, рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓ рдУрдкрдирд╕реНрд▓реЗ рдФрд░ рдЙрд╕рдХреЗ ilk рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдмрд▓реНрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рд╣реИ -
рдЯрд┐рдХреНрд▓ рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ ред рдФрд░ рд╣рдо Tcl рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ :
* рдХрдордмрдЦреНрдд рд╡рд┐рдХреА рдЬрд╣рд╛рдВ рдЦрд┐рд▓реМрдиреЗ рднреА рд╣реИрдВ (рдЖрдк рд╡рд╣рд╛рдВ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ :)
* рдЪрд╛рджрд░реЛрдВ рдХреЛ рдзреЛрдЦрд╛ рджреЗрдирд╛
* рд╕рд╛рдорд╛рдиреНрдп рдЯреИрд▓реНрдХрд┐рдЯ рдмрдирд╛рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╢реБрд▓реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ 1.5 - 2 рдПрдордмреА)
* рдФрд░ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдЗрд╡реЛрдХ рдЕрд╕реЗрдВрдмрд▓реА рдПрд╡реЛрд▓рди рд╕реЗ (рдзреНрдпрд╛рди рд╕реЗ рдореГрдд рд╕рд╛рдЗрдЯ рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд :(
рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯреВрд▓рдХрд┐рдЯ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ Tcl / Tk рд░реЗрдЯрд┐рдВрдЧ рд░рдЦреЗрдВ
рдФрд░, рд╣рд╛рдБ, wiki.tcl.tk/16867 (cgi рд╕реЗ Tcl рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░, рд╕рдордп-рд╕рдордп рдкрд░ рдЯреИрд▓реНрдХрд┐рдЯ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдПрдирд╡рд┐рд╡реЗрдмрд▓ рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рдФрд░ рдпрд╣ рднреА рд╕рд┐рд░реНрдл рд╕реБрдВрджрд░ рдФрд░ рд╕реБрдВрджрд░ рд╣реИ :)
рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ
рдлрд╝реНрд░реАрд╡реИрдк рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ
рдЬреЛрдбрд╝реВрдВрдЧрд╛ , рдЬреЛ рд╣рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдПрдордПрд╕ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪреЗрдирдлреНрд░реЙрдорд░реНрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реЛрдЧреА:
bash-4.3$ ./chainfromcert_linux64 Copyright(C)2019 Usage: chainfromcert <file with certificate> <directory for chain certificate> Bad usage! bash-4.3$
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ (рдкреАрдИрдПрдо рдкреНрд░рд╛рд░реВрдк рдФрд░ рдбреАрдИрдЖрд░ рдкреНрд░рд╛рд░реВрдк рджреЛрдиреЛрдВ рдореЗрдВ) рдФрд░ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕реАрдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ:
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$
рдЕрдм рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рд╛рдзрд┐рдХрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЬрд╛рд░реА рдХрд░рддреА рд╣реИ, рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдУрдЖрдИрдбреА 1.3.6.1.5.5.7.1.1 рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди CA рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рджреЛрдиреЛрдВ рд╕реНрдерд╛рди (oid 1.3.6.1.5.5.7.48.2 рдкрд░) рдФрд░ OCSP CA рд╕реЗрд╡рд╛ (oid 1.3.6.1.5.5.7.48.1) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдФрд░ рдЬрд╛рдирдХрд╛рд░реА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреБрдВрдЬреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдУрдб 2.5.29.16 рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрдХреНрдХреА рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
#!/usr/bin/tclsh -f package require pki
рд╣рдореЗрдВ base64 рдкреИрдХреЗрдЬ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
package require base64
рдкрдХреНрдХреА рдкреИрдХреЗрдЬ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдП рдПрд╕рдПрди рдкреИрдХреЗрдЬ рдФрд░ рдмреЗрд╕ 64 рдкреИрдХреЗрдЬ рдЬреЛ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рдкреАрдИрдПрдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдбреАрдИрдЖрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдПрдПрд╕рдПрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ред
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ:
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
рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдбреАрдИрдЖрд░ рдкреНрд░рд╛рд░реВрдк (рдмрд╛рдЗрдирд░реА рдХреЛрдб) рдФрд░ рдкреАрдИрдПрдо рдкреНрд░рд╛рд░реВрдк (рдмреЗрд╕рд┐рди рдПрдиреНрдХреЛрдбрд┐рдВрдЧ) рджреЛрдиреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЪреЗрдирдлреНрд░реЙрдорд░реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
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 }
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рднреА рд░реАрдбрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ:
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 -----"), рддреЛ рдЗрд╕ рдлрд╛рдЗрд▓ рдХрд╛ рдмреЙрдбреА рдЪреБрдирдХрд░ рдПрдХ рдмрд┐рдирд╛рд░ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
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 рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдорд┐рд▓реАред
рд▓реЗрдХрд┐рди рд╣рдо рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рднреА рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рдереЗред
рдЗрд╕ рдкреНрд░рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд╣рдо
freewrapTCLSH рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЛ 32-рдмрд┐рдЯ рдФрд░ 64-рдмрд┐рдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдПрдВрдЧреЗред рдХрд┐рд╕реА рднреА рдордВрдЪ рдкрд░ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреЛрдЯреЛрд▓реЙрдЬреА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореИрдВ linux_x86_64 (Mageia) рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдВрдЧрд╛ред
рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
1. linux_x86_64 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдлрд╝реНрд░реАрд╡реНрд░реЗрдкреНрдЯрдмреНрд▓рд╢ рдЙрдкрдпреЛрдЧрд┐рддрд╛;
2. рдкреНрд░рддреНрдпреЗрдХ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде freewrapTCLSH рдлрд╝рд╛рдЗрд▓:
- freewrapTCLSH_linux32
- freewrapTCLSH_linux64
- freewrapTCLSH_win32
- freewrapTCLSH_win64
3. рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓: chainfromcert.tcl
рддреЛ, рд▓рд┐рдирдХреНрд╕ x86 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЗрдХрдЯреНрдареЗ рд╣реБрдП рдЪреЗрдирдлреНрд░реЛрдорд░рд╕рд┐рдЯреА_рд▓рд┐рдирдХреНрд╕рдПрдХреНрд╕ 86 рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди:
$freewrapTCLSH chainfromcert.tcl тАУw freewrapTCLSH_linux32 тАУo chainfromcerty_linuxx86 $
рд╡рд┐рдВрдбреЛрдЬ 64-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
$freewrapTCLSH chainfromcert.tcl тАУw freewrapTCLSH_win64 тАУo chainfromcerty_win64.exe $
рдЖрджрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред
рдХреЛрдб рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдиреЗ рд╡рд╛рд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ, рдореИрдВ рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде
fsb795 рдкреИрдХреЗрдЬ (рдЬрд┐рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рдкреВрд░рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред