PKCS # 11 рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдЯреЛрдХрди: рдкреНрд░рдорд╛рдг рдкрддреНрд░ рджреЗрдЦрдирд╛ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛, рдЙрдирдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

рдЫрд╡рд┐ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ "рд░реВрд╕реА рдпреЛрдЧреНрдп x509 рдкреНрд░рдорд╛рдг рдкрддреНрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрдЧреНрд░реЗрдЬреА-рднрд╛рд╖рд╛ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛" рдПрдХ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЗрдЪреНрдЫрд╛ рдереА рдХрд┐ рди рдХреЗрд╡рд▓ "рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ" рд╣реЛ, рдмрд▓реНрдХрд┐ "рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдкреАрдХреЗрдПрд╕ рд╕рддреНрдпрд╛рдкрди рднреА рдХрд░реЗрдВ, рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ред "ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рдпрд╣ рд╕рдЪ рд╣реИ, рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ PKCS # 11 рдЯреЛрдХрди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ рд╡рд╣реА рд╣реБрдЖред



рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рджреЗрдЦрдиреЗ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ Tcl / Tk рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ PKCS # 11 рдЯреЛрдХрди / рд╕реНрдорд╛рд░реНрдЯрдХрд╛рд░реНрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рджреЗрдЦрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛, рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:

  • рдЯреЛрдХрди / рд╕реНрдорд╛рд░реНрдЯ рдХрд╛рд░реНрдб рд╕реЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг;
  • рдирд┐рд░рд╕реНрдд рд╕реАрдЖрд░рдПрд▓ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╕реВрдЪреА рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ;
  • OCSP рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рд╡реИрдзрддрд╛ рдХреЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред

PKCS # 11 рдЯреЛрдХрди рддрдХ рдкрд╣реБрдВрдЪ


рдЯреЛрдХрди рдФрд░ рдЙрд╕ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо TclPKCS11 рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреИрдХреЗрдЬ рдХреЛ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдФрд░ рд╕реЛрд░реНрд╕ рдХреЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдВрдЧреЗ рдЬрдм рд╣рдо рдкреИрдХреЗрдЬ рдореЗрдВ рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред TclPKCS11 рдкреИрдХреЗрдЬ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдпрд╛ рдкреНрд░рдкрддреНрд░ рдХреЗ tcl рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

load < tclpkcs11> Tclpkcs11 

рдпрд╛ рдЗрд╕реЗ рдмрд╕ pki :: pkcs11 рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, tclpkcs11 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ pkgIndex.tcl рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА pkcs11 рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ) рдФрд░ рдЗрд╕реЗ auto_path рдкрде рдореЗрдВ рдЬреЛрдбрд╝рдирд╛:

 #lappend auto_path [file dirname [info scrypt]] lappend auto_path pkcs11 package require pki package require pki::pkcs11 

рдЪреВрдБрдХрд┐ рд╣рдо TclPKCS11 рдкреИрдХреЗрдЬ рд╕реЗ рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЯреЛрдХрди рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 ::pki::pkcs11::loadmodule <filename> -> handle ::pki::pkcs11::unloadmodule <handle> -> true/false ::pki::pkcs11::listslots <handle> -> list: slotId label flags ::pki::pkcs11::listcerts <handle> <slotId> -> list: keylist ::pki::pkcs11::login <handle> <slotId> <password> -> true/false ::pki::pkcs11::logout <handle> <slotId> -> true/false 
рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рд▓реЙрдЧрд┐рди рдФрд░ рд▓реЙрдЧрдЖрдЙрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреЛрдХрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдкрд░ рдкрд┐рди рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди :: pki :: pkcs11 :: loadmodule PKCS # 11 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЯреЛрдХрди / рд╕реНрдорд╛рд░реНрдЯ рдХрд╛рд░реНрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛ рддреЛ рдПрдХ рдЯреЛрдХрди рдЦрд░реАрджрдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреВрд░реНрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЗ рдЯреЛрдХрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЛрдбрдореЛрдбреНрдпреВрд▓ рдлрд╝рдВрдХреНрд╢рди рднрд░реА рд╣реБрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 set filelib "/usr/local/lib64/librtpkcs11ecp_2.0.so" set handle [::pki::pkcs11::loadmodule $filelib] 

рддрджрдиреБрд╕рд╛рд░, рднрд░реА рд╣реБрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЙрддрд╛рд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ:

 ::pki::pkcs11::unloadmodule $handle 

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╣реИрдВрдбрд▓ рд╣реИ, рдЖрдк рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕реНрд▓реЙрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 ::pki::pkcs11::listslots $handle {0 {ruToken ECP } {TOKEN_PRESENT RNG LOGIN_REQUIRED USER_PIN_INITIALIZED TOKEN_INITIALIZED REMOVABLE_DEVICE HW_SLOT}} {1 { } {REMOVABLE_DEVICE HW_SLOT}} . . . {14 { } {REMOVABLE_D EVICE HW_SLOT}} 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реВрдЪреА рдореЗрдВ 15 (рдкрдВрджреНрд░рд╣ рд╕реЗ 0 рд╕реЗ 14) рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЯреЛрдХрдиреЛрдВ рдХреЗ RuToken рдкрд░рд┐рд╡рд╛рд░ рдХрд┐рддрдиреЗ рд╕реНрд▓реЙрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рд╕реВрдЪреА рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рд╕реНрд╡рдпрдВ рддреАрди рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:

 {{ } { } {   }} 

рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╕реНрд▓реЙрдЯ рдирдВрдмрд░ рд╣реИред рд╕реВрдЪреА рдХрд╛ рджреВрд╕рд░рд╛ рддрддреНрд╡ рдЯреЛрдХрди рд╕реНрд▓реЙрдЯ (32 рдмрд╛рдЗрдЯреНрд╕) рдореЗрдВ рд╕реНрдерд┐рдд рд▓реЗрдмрд▓ рд╣реИред рдпрджрд┐ рд╕реНрд▓реЙрдЯ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рджреВрд╕рд░реЗ рддрддреНрд╡ рдореЗрдВ 32 рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реИрдВред рдФрд░ рд╕реВрдЪреА рдХреЗ рдЕрдВрддрд┐рдо, рддреАрд╕рд░реЗ рддрддреНрд╡ рдореЗрдВ рдЭрдВрдбреЗ рд╣реИрдВред рд╣рдо рдЭрдВрдбреЗ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрди рдЭрдВрдбреЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ TOKEN_PRESENT рдзреНрд╡рдЬ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред рдпрд╣ рдпрд╣ рдзреНрд╡рдЬ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЯреЛрдХрди рдкрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЭрдВрдбреЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИрдВ, рд╡реЗ рдЯреЛрдХрди рдХреА рд╕реНрдерд┐рддрд┐, рдкрд┐рди рдХреЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рдЖрджрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЭрдВрдбреЗ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, PKCS # 11 рдЯреЛрдХрди рдкреНрд░рдмрдВрдзрд┐рдд рд╣реИрдВ:



рдЕрдм, рдХреБрдЫ рднреА рдЖрдкрдХреЛ рд╕реНрд▓реЙрдЯреНрд╕_with_token рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдореЗрдВ рдЯреЛрдХрди рдХреЗ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рд╕реНрд▓реЙрдЯ рдХреА рдПрдХ рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛:

 #!/usr/bin/tclsh lappend auto_path pkcs11 package require pki package require pki::pkcs11 #    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] } set filelib "/usr/local/lib64/librtpkcs11ecp_2.0.so" if {[catch {set handle [::pki::pkcs11::loadmodule $filelib]} res]} { puts "Cannot load library $filelib : $res" exit } #   set listslots {} set listslots [::slots_with_token $handle] #        while {[llength $listslots] == 0} { puts " " after 3000 set listslots [::slots_with_token $handle] } #        foreach {slotid labeltok} $listslots { puts "Number slot: $slotid" puts "Label token: $labeltok" } 

рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдлрд╛рдЗрд▓ рд╕реНрд▓реЙрдЯреНрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж_with_token.tcl, рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

 $ ./slots_with_token.tcl listtok(0) = ruToken ECP listtok(1) = RuTokenECP20 Number slot: 0 Label token: RuTokenECP20 Number slot: 1 Label token: ruToken ECP $ 

рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз 15 рд╕реНрд▓реЙрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рджреЛ рд╣реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╢реВрдиреНрдп рдФрд░ рдкрд╣рд▓рд╛ред
рдЕрдм рдХреБрдЫ рднреА рдирд╣реАрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЛрдХрди рдкрд░ рд╕реНрдерд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ:

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

рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдореЗрдВ рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди :: pki :: pkcs11 :: listcerts рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ :: pki :: x509 :: pse рдкреИрдХреЗрдЬ рд╕реЗ parse_certред рд▓реЗрдХрд┐рди рд╕рдорд╛рд░реЛрд╣ :: pki :: pkcs11 :: рд╢реНрд░реЛрддрд╛ рдЗрд╕ рд╕реВрдЪреА рдХреЛ PKCS # 11 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:

  • pkcs11_ рд▓реЗрдмрд▓ рддрддреНрд╡ (PKCS рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ # 11 рд╡рд┐рд╢реЗрд╖рддрд╛ CKA_LABEL);
  • pkcs11_id рддрддреНрд╡ (PKCS рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ # 11 рд╡рд┐рд╢реЗрд╖рддрд╛ CKA_ID);
  • pkcs11_handle рд▓реЛрдб рдХрд┐рдП рдЧрдП PKCS # 11 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рддрддреНрд╡;
  • pkcs11_slotid рддрддреНрд╡ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╕реНрд▓реЙрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдпреБрдХреНрдд, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реНрдерд┐рдд рд╣реИ;
  • рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрддреНрд╡ рдЬрд┐рд╕рдореЗрдВ рдЯреЛрдХрди рдкрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд▓рд┐рдП pkcs11 рдорд╛рди рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╢реЗрд╖ рддрддреНрд╡ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ pki :: parse_cert рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдиреАрдЪреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд▓реЗрдмрд▓ (рд╕реВрдЪреАрдкрддреНрд░) рдХреА рд╕реВрдЪреА (CKA_LABEL, pkcs11_label) рдФрд░ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ (:: certs_p11)ред рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреБрдВрдЬреА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд▓реЗрдмрд▓ (CKA_LABEL, pkcs11_label) рд╣реИ:

 #  proc listcerttok {handle token_slotlabel token_slotid} { #     set listCer {} #   array set ::arrayCer [] set ::certs_p11 [pki::pkcs11::listcerts $handle $token_slotid] if {[llength $::certs_p11] == 0} { puts {Certificates are not on the token:$tokenslotlabel} return $listCer } foreach certinfo_list $::certs_p11 { unset -nocomplain certinfo array set certinfo $certinfo_list set certinfo(pubkeyinfo) [::pki::x509::parse_cert_pubkeyinfo $certinfo(cert)] set ::arrayCer($certinfo(pkcs11_label)) $certinfo(cert) lappend listCer $certinfo(pkcs11_label) } return $listCer } 

рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реИрдВ, рд╣рдо рдЪреБрдкрдЪрд╛рдк рдХреЙрдореНрдмреЛрдХреНрд╕ рдореЗрдВ рдЙрдирдХреЗ рд▓реЗрдмрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:



GOST рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЛ рд╢рдмреНрджред рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреАрдИрдПрдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбреАрдИрдЖрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (рдбреАрдИрдЖрд░ рдмрдЯрди, рдкреАрдИрдПрдо рдкреНрд░рд╛рд░реВрдк) рджреЛрдиреЛрдВ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред Pki рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдп pki рд╣реИ: PEM рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _ encode_pem:

 set bufpem [::pki::_encode_pem <der-buffer> <Headline> <Lastline>] 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 set certpem [::pki::encode_pen $cert_der "-----BEGIN CERTIFICATE-----" "-----END CERTIFICATE-----"] 

рдХреЛрдореНрдмреЛрдХреНрд╕ рдореЗрдВ рд╕реЗрдкреНрдЯрд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд▓реЗрдмрд▓ рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ, рд╣рдо рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╢рд░реАрд░ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 #    set nick [.saveCert.labExp.listCert get] #        foreach certinfo_list $::certs_p11 { unset -nocomplain cert_parse array set cert_parse $certinfo_list if {$cert_parse(pkcs11_label) == $nick} { #   set cert_parse(pubkeyinfo) [::pki::x509::parse_cert_pubkeyinfo $cert_parse(cert)] break } } #   file|pkcs11 set ::tekcert "pkcs11" 

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрдВрддреНрд░ рдкрд╣рд▓реЗ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди


рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп, рдЪрд░ :: notbefore рдФрд░ :: рдЙрд╕рдХреЗ рдмрд╛рдж рдЙрд╕ рддрд╛рд░реАрдЦ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╕рдВрдЪрд╛рд▓рди (рд╕рд╛рдЗрди, рдЗрдирдХреНрд░рд┐рдкреНрдЯ, рдЖрджрд┐) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рд╣реИрдВ:

 proc cert_valid_date {} { #       #    set startdate $::notbefore #    set enddate $::notafter #      set now [clock seconds] set isvalid 1 set reason "Certificate is valid" if {$startdate > $now} { set isvalid 0 #      set reason "Certificate is not yet valid" } elseif {$now > $enddate} { set isvalid 0 #    set reason "Certificate has expired" } return [list $isvalid $reason] } 

рд▓реМрдЯреА рд╕реВрдЪреА рдореЗрдВ рджреЛ рдЖрдЗрдЯрдо рд╣реИрдВред рдкрд╣рд▓реЗ рддрддреНрд╡ рдореЗрдВ 0 (рд╢реВрдиреНрдп) рдпрд╛ 1 (рдПрдХ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред "1" рдХрд╛ рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рдиреНрдп рд╣реИ, рдФрд░ 0 рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рджреВрд╕рд░реЗ рддрддреНрд╡ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрддреНрд╡ рдореЗрдВ рддреАрди рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рдиреНрдп (рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ 1 рд╣реИ):
  • рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЕрднреА рддрдХ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ (рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ)
  • рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╡реИрдзрддрд╛ рди рдХреЗрд╡рд▓ рдЗрд╕рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗрдВрджреНрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдпрд╛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдЕрдкрдиреА рдкрд╣рд▓ рдкрд░ рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдзрд╛рд░рдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдорд╛рдзреНрдпрдо рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдкреНрд░рд╛рдзрд┐рдХреГрдд рдЕрдзрд┐рдХрд╛рд░реА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░рд╕реНрдд COS / CRL рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ CA рджреНрд╡рд╛рд░рд╛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, CRL рд╡рд┐рддрд░рдг рдмрд┐рдВрджреБ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдирд┐рд░рд╕реНрдд рдкреНрд░рдорд╛рдг рдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред

рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╡реИрдзрддрд╛ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдПрд╕рдУрдПрд╕ / рд╕реАрдЖрд░рдПрд▓ рджреНрд╡рд╛рд░рд╛


рдкрд╣рд▓рд╛ рдХрджрдо рдПрд╕рдУрдПрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
COC / CRL рдЬрд╛рд░реА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕реВрдЪреА рдУрдб 2.5.29.31 (id-Ce-cRLDistributionPoints) рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд╣реИ:

 array set extcert $cert_parse(extensions) set ::crlfile "" if {[info exists extcert(2.5.29.31)]} { set ::crlfile [crlpoints [lindex $extcert(2.5.29.31) 1]] } else { puts "cannot load CRL" } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрд╕рдУрдПрд╕ / рд╕реАрдЖрд░рдПрд▓ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 set filecrl "" set pointcrl "" foreach pointcrl $::crlfile { set filecrl [readca $pointcrl $dir] if {$filecrl != ""} { set f [file join $dir [file tail $pointcrl]] set fd [open $fw] chan configure $fd -translation binary puts -nonewline $fd $filecrl close $fd set filecrl $f break } # CRL  .     CRL } if {$filecrl == ""} { puts "Cannot load CRL" } 

рджрд░рдЕрд╕рд▓, COC / CRL рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдбрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 proc readca {url dir} { set cer "" #   if { "https://" == [string range $url 0 7]} { #    tls http::register https 443 ::tls::socket } #     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 } 

Dir рд╡реИрд░рд┐рдПрдмрд▓ рдЙрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ COS / CRL рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ url рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ CRL рд╡рд┐рддрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреА рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕реВрдЪреА рд╣реИред

рдПрд╕рдУрдПрд╕ / рд╕реАрдЖрд░рдПрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдЕрдЪрд╛рдирдХ рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рдХреБрдЫ рдкреНрд░рдорд╛рдг рдкрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реВрдЪреА рдЕрдирд╛рдо рдореЛрдб рдореЗрдВ https (tls) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреА рдереАред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ: рд╕реАрдЖрд░рдПрд▓ рд╕реВрдЪреА рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдирд╛рдо https рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрд░реА рдкрд╣реБрдВрдЪ рд╣реИред рд▓реЗрдХрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ tls рдкреИрдХреЗрдЬ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдкреИрдХреЗрдЬ tls рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрджрд┐ SOS / CRL рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдореЗрдВ OCSP рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЪрд░реНрдЪрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдХреА рдЬрд╛рдПрдЧреАред

рдЗрд╕рд▓рд┐рдП, рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реИ, рдПрд╕рдУрдПрд╕ / рд╕реАрдЖрд░рдПрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрдХреНрдХреА рдкреИрдХреЗрдЬ рдореЗрдВ рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдирд┐рд░рд╕реНрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рд╡реИрдзрддрд╛ (рдЗрд╕рдХреЗ рдЧреИрд░-рдирд┐рд░рд╕рди) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрдиреА рдереА

validaty_cert_from_crl:
 proc validaty_cert_from_crl {crl sernum issuer} { array set ret [list] if { [string range $crl 0 9 ] == "-----BEGIN" } { array set parsed_crl [::pki::_parse_pem $crl "-----BEGIN X509 CRL-----" "-----END X509 CRL-----"] set crl $parsed_crl(data) } ::asn::asnGetSequence crl crl_seq ::asn::asnGetSequence crl_seq crl_base ::asn::asnPeekByte crl_base peek_tag if {$peek_tag == 0x02} { #   .CRL ::asn::asnGetInteger crl_base ret(version) incr ret(version) } else { set ret(version) 1 } ::asn::asnGetSequence crl_base crl_full ::asn::asnGetObjectIdentifier crl_full ret(signtype) ::::asn::asnGetSequence crl_base crl_issue set ret(issue) [::pki::x509::_dn_to_string $crl_issue] #     /CRL if {$ret(issue) != $issuer } { #/CRL    set ret(error) "Bad Issuer" return [array get ret] } binary scan $crl_issue H* ret(issue_hex) #  ::asn::asnGetUTCTime crl_base ret(publishDate) #   ::asn::asnGetUTCTime crl_base ret(nextDate) #   ::asn::asnPeekByte crl_base peek_tag if {$peek_tag != 0x30} { #    return [array get ret] } ::asn::asnGetSequence crl_base lcert # binary scan $lcert H* ret(lcert) while {$lcert != ""} { ::asn::asnGetSequence lcert lcerti #    ::asn::asnGetBigInteger lcerti ret(sernumrev) set ret(sernumrev) [::math::bignum::tostr $ret(sernumrev)] #      CRL if {$ret(sernumrev) != $sernum} { continue } # .    ::asn::asnGetUTCTime lcerti ret(revokeDate) if {$lcerti != ""} { #   ::asn::asnGetSequence lcerti lcertir ::asn::asnGetSequence lcertir reasone ::asn::asnGetObjectIdentifier reasone ret(reasone) ::asn::asnGetOctetString reasone reasone2 ::asn::asnGetEnumeration reasone2 ret(reasoneData) } break; } return [array get ret] } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдирд┐рд░рд╕реНрддреАрдХрд░рдг рд╕реВрдЪреА (crl) рд╣реИрдВ, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ (рд╕рд░рдиреЗрдо), рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд╢рдХ (рдЬрд╛рд░реАрдХрд░реНрддрд╛)ред

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдирд┐рд░рд╕реНрддреАрдХрд░рдг рд╕реВрдЪреА (crl) рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рднрд░реА рд╣реБрдИ рд╣реИ:

 set f [open $filecrl r] chan configure $f -translation binary set crl [read $f] close $f 

рд╕рддреНрдпрд╛рдкрд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ (рд╕реЗрд░реНрдирдо) рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд╢рдХ (рдЬрд╛рд░реАрдХрд░реНрддрд╛) рдХреА рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд░ :: рд╕реНрдиреИрд░реНрдЯ рдФрд░ :: рдЬрд╛рд░реАрдХрд░реНрддрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб, рдУрдПрд╕ рдПрдХреНрд╕ (рдореИрдХрдУрдПрд╕) рдФрд░ рдПрдордПрд╕ рд╡рд┐рдВрдбреЛрдЬ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдмрд░рдХрд░рд╛рд░ рд░рдЦрддреА рд╣реИ:



рд╡реИрд╕реЗ, рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рджреЗрдЦреЗ рдЧрдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЯреЛрдХрди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЧрдПред рдЗрд╕рд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбреАрдИрдЖрд░ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдкреАрдИрдПрдо рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ PKCS # 11 рдЯреЛрдХрди / рд╕реНрдорд╛рд░реНрдЯрдХрд╛рд░реНрдб рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рджрд░реНрд╢рдХ рд╣реИред

рд╣рд╛рдВ, рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛: рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдЕрддрд┐рд░рд┐рдХреНрдд" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдореЗрдиреВ рдЖрдЗрдЯрдо "рд╕реАрдЖрд░рдПрд▓ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдп" рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдпрд╛ рджрд╛рдПрдВ рдорд╛рдЙрд╕ рдмрдЯрди рджрдмрд╛рдПрдВ рдФрд░ рдЬрдм рдХрд░реНрд╕рд░ рдореБрдЦреНрдп рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рд╣реЛ рдлрд╝реАрд▓реНрдб рдФрд░ "рд╕реАрдЖрд░рдПрд▓ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдп" рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ:



рдпрд╣ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреНрд▓рд╛рдЙрдб рдЯреЛрдХрди рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдкрд░ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдкреАрдПрд╕рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкреАрдХреЗрд╕реАрдПрд╕ # 11 рдЯреЛрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ "рдЦреБрдж рдХреЛ рд╕рдм рдХреБрдЫ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВ"ред рд╣рд╛рдВ, рдЯреЛрдХрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИрдВред рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╣рдо рди рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ OCSP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рддрдВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА (рд╣рдо рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмреЗрд╢рдХ, GOST рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА) рдЯреЛрдХрди / рд╕реНрдорд╛рд░реНрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .h (GOST R 34-10- 94/2012), рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рдЧрдарди рдФрд░ рд╕рддреНрдпрд╛рдкрди рдЖрджрд┐ред

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


All Articles