Π΅ ΡΡΠ°Π½Π΄Π°ΡΡ (ISO, ITU-T, ΠΠΠ‘Π’) Π·Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅. ΠΠ° ΠΌΠ΅Π½ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡ, ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Π½Π°ΡΠ΅Π΄ Ρ JSON, XML, XDR ΠΈ Π΄ΡΡΠ³ΠΈ. Π’ΠΎΠΉ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅ΡΠΎ Π½ΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Ρ Ρ Π½Π΅Π³ΠΎ: Π² ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ, ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΈ ΠΈ VoIP ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ (UMTS, LTE, WiMAX, SS7, H.323), Π² ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ (LDAP, SNMP, Kerberos), Π²ΡΠ² Π²ΡΠΈΡΠΊΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ (X.509, CMS, PKCS ΡΡΠ°Π½Π΄Π°ΡΡΠΈ), Π² Π±Π°Π½ΠΊΠΎΠ²ΠΈ ΠΊΠ°ΡΡΠΈ ΠΈ Π±ΠΈΠΎΠΌΠ΅ΡΡΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠΏΠΎΡΡΠΈ ΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΡΠ°.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ : Python ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ Π² .

ΠΠ°ΠΈΡΡΠΈΠ½Π° Π½Π΅ Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ASN.1 Π·Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ: ASN.1 ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΠ΄Π΅ΡΠΈ ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΊΠΎΠ΄ΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π΅ΡΠ΄ΠΎΠ±Π΅Π½, Π° ΡΠΎΠ²Π° Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π²Π΅ΠΊΡΠΎΡ Π·Π° Π°ΡΠ°ΠΊΠ°. ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΡΡ Π¨Π½Π°ΠΉΠ΅Ρ Π² ΡΠ²ΠΎΡΡΠ° ΡΡΡΠΎ Π½Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡ Π·Π°ΡΠ°Π΄ΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ: Β«ΠΠ°ΠΉ-ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΡ TLV ΠΊΠΎΠ΄Π΅ΠΊ Π΅ ASN.1, Π½ΠΎ Π΅ Π½Π΅ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ ΠΈ ΡΠ΅ ΠΎΡΡΠ΅Π³Π»ΡΠΌΠ΅ ΠΎΡ Π½Π΅Π³ΠΎΒ». ΠΠΎ, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π΄Π½Π΅Ρ ΠΈΠΌΠ°ΠΌΠ΅ Π² ΠΊΠΎΠΈΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ , CRL, OCSP, TSP, ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ CMP, , ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ , ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΈ ΠΠ°ΡΠΎΠ²Π° Π΅ Π½Π°Π»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠΌΠ΅Π΅ΠΌ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ ASN.1, Π°ΠΊΠΎ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌΠ΅ Ρ Π½Π΅ΡΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ.
ASN.1 ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΎ ΠΏΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π°ΡΠΈΠ½ΠΈ/ΠΊΠΎΠ΄Π΅ΡΠΈ:
- (Basic Encoding Rules)
- (Canonical Encoding Rules)
- (Distinguished Encoding Rules)
- (Generic String Encoding Rules)
- (JSON Encoding Rules)
- LWER (Light Weight Encoding Rules)
- (Octet Encoding Rules)
- (Packed Encoding Rules)
- SER (Signalling specific Encoding Rules)
- (XML Encoding Rules)
ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠΎ Π² ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΄Π²Π°: BER ΠΈ DER. ΠΠΎΡΠΈ Π² ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ XML Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ (, ) ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Base64-ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ ASN.1 DER ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² JSON-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΎΡ Letβs Encrypt. ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΊΠΎΠ΄Π΅ΡΠΈ ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ BER/CER/DER Π² ΡΡΠ°ΡΠΈΠΈ ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ: , , .
BER Π΅ Π±ΠΈΠ½Π°ΡΠ΅Π½ Π±Π°ΠΉΡ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ PER, ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½ Π² ΠΌΠΎΠ±ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ β Π±ΠΈΡ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½) TLV ΡΠΎΡΠΌΠ°Ρ. ΠΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΡΠ΅ ΠΊΠΎΠ΄ΠΈΡΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π°: Π΅ΡΠΈΠΊΠ΅Ρ (TΡΠΈΠΏ Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ½ΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ (ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ, Π½ΠΈΠ·, Π΄Π°ΡΠ° ΠΈ Ρ.Π½.), Π΄ΡΠ»ΠΆΠΈΠ½Π° (LΠ΄ΡΠ»ΠΆΠΈΠ½Π°) Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ ΠΈ ΡΠ°ΠΌΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ (Value). BER Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ°, Π·Π°Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π° ΠΈ Π·Π°Π²ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Ρ ΠΌΠ°ΡΠΊΠ΅Ρ End-Of-Octets. ΠΡΠ²Π΅Π½ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ°, Π² BER ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΡΡ Π² Π½Π°ΡΠΈΠ½Π° Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- INTEGER, OBJECT IDENTIFIER, BIT STRING ΠΈ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π΅Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ (Π½Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ Π² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π°ΡΠ° ΡΠΎΡΠΌΠ°);
- BOOLEAN Π΅ ΠΈΡΡΠΈΠ½Π΅Π½ ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅;
- BIT STRING ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° "ΠΈΠ·Π»ΠΈΡΠ½ΠΈ" Π½ΡΠ»Π΅Π²ΠΈ Π±ΠΈΡΠΎΠ²Π΅;
- BIT STRING, OCTET STRING ΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Ρ Π½ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ ΡΡΡΠΎΠΊΠΎΠ²ΠΈ ΡΠΈΠΏΠΎΠ²Π΅, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π°ΡΠ°/Π²ΡΠ΅ΠΌΠ΅, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° ΠΏΠ°ΡΡΠ΅ΡΠ° (chunk) ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°, ΡΠΈΡΡΠΎ Π΄ΡΠ»ΠΆΠΈΠ½Π° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° (Π΄Π΅)ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π΅ Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ;
- UTCTime/GeneralizedTime ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅Π²ΠΎΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ "ΠΈΠ·Π»ΠΈΡΠ½ΠΈ" Π½ΡΠ»Π΅Π²ΠΈ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ;
- DEFAULT ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° SEQUENCE ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ, Π° ΠΌΠΎΠ³Π°Ρ ΠΈ Π΄Π° Π½Π΅ Π±ΡΠ΄Π°Ρ;
- ΠΠΌΠ΅Π½ΡΠ²Π°Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π±ΠΈΡΠΎΠ²Π΅ Π² BIT STRING ΠΌΠΎΠ³Π°Ρ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° Π½Π΅ Π±ΡΠ΄Π°Ρ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ;
- SEQUENCE (OF)/SET (OF) ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠΌΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ΅Π΄ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅.
ΠΠΎΡΠ°Π΄ΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΡΠ°ΠΊΠ°, ΡΠ΅ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΡΠΎΡΠΌΠ° β Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π°. ΠΠ°ΡΠΎΠ²Π° Π΅ ΠΈΠ·ΡΠ°Π±ΠΎΡΠ΅Π½ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π°: DER β ΡΡΡΠΎΠ³ΠΎ ΡΠ΅Π³Π»Π°ΠΌΠ΅Π½ΡΠΈΡΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌ Π½Π°ΡΠΈΠ½ Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π·Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ Π±ΠΈΡ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π°ΡΠ° ΡΡΠΌΠ° Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Π°. DER ΠΈΠΌΠ° ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΈΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ, ΡΠ΅ Π΄ΡΠ»ΠΆΠΈΠ½ΠΈΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ΅ΡΠΈΠΉΠ½Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ. CER ΠΊΠΎΠ΄Π΅ΠΊΡΡ Π΅ Π»ΠΈΡΠ΅Π½ ΠΎΡ ΡΠΎΠ·ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΡΡΠ½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ (ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΈΠ΅, ΡΠ΅ Π½ΡΠΌΠ°ΠΌΠ΅ ΠΎΡΠ΅ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠΈ?), ΡΠΎΠΉ Π½Π΅ ΡΡΠ°Π½Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½. ΠΠ°ΡΠΎΠ²Π° Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ "ΡΠΌΠ΅ΡΠ°Π½ΠΎ" ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BER ΠΈ DER ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠ°ΠΊΡΠΎ CER, ΡΠ°ΠΊΠ° ΠΈ DER ΡΠ° ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π° BER, Π²ΡΠ΅ΠΊΠΈ BER-Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ Π΅ Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π° Π³ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ pyasn1
ΠΠ° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΈΡΠ΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° Python, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ. ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠ·Π±ΠΎΡΡΡ Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠ΅: ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΡΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠΈ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°, ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° . ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π±ΡΡ ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ°Π±ΠΎΡΠ° Ρ ASN.1 ΡΡΡΡΠΊΡΡΡΠΈ ΠΊΠ°ΡΠΎ Ρ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ ΠΎΠ±Π΅ΠΊΡΠΈ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈΡΡ ΠΎΠ±Π΅ΠΊΡ Π½Π° X.509 ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π΄Π°Π²Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° ΠΌΡ ΡΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ ΡΠ΅ΡΠ½ΠΈΠΊ: cert[Β«tbsCertificateΒ»][Β«serialNumberΒ»] ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΡΠ΅ΡΠΈΠ΅Π½ Π½ΠΎΠΌΠ΅Ρ Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. ΠΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°ΡΠΈΠ½, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° βΡΠ³Π»ΠΎΠ±ΡΠ²Π°ΠΌΠ΅β ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, ΡΠ°Π±ΠΎΡΠ΅ΠΉΠΊΠΈ Ρ ΡΡΡ ΠΊΠ°ΡΠΎ Ρ ΡΠΏΠΈΡΡΡΠΈ ΠΈ ΡΠ΅ΡΠ½ΠΈΡΠΈ, Π° ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° pyasn1.codec.der.encoder.encode ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. Π pyasn1 ΠΈΠΌΠ°ΡΠ΅ ΠΈ, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π²ΡΠ΅ ΠΎΡΠ΅ ΠΈΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ: ΠΊΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°, Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²Π΅ Π² pyasn1 β GeneralizedTime, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ° ΠΈ ΠΊΠΎΠ΄ΠΈΡΠ°.
Π Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π·Π° Π΄Π° ΡΠΏΠ΅ΡΡΠΈΠΌ ΠΌΡΡΡΠΎ, ΡΠ΅ΡΡΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΏΡΡΡ Π΄ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° ΠΈ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π² Π±Π°ΠΉΡΠΎΠ²Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π΅ΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΉΠ» ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΡΠ΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² CMS SignedData ASN.1 ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°:
0 [1,3,1018] ContentInfo SEQUENCE
4 [1,1, 9] . contentType: ContentType OBJECT IDENTIFIER 1.2.840.113549.1.7.2 (id_signedData)
19-4 [0,0,1003] . content: [0] EXPLICIT [UNIV 16] ANY
19 [1,3, 999] . . DEFINED BY id_signedData: SignedData SEQUENCE
23 [1,1, 1] . . . version: CMSVersion INTEGER v3 (03)
26 [1,1, 19] . . . digestAlgorithms: DigestAlgorithmIdentifiers SET OF
[...]
47 [1,3, 769] . . . encapContentInfo: EncapsulatedContentInfo SEQUENCE
51 [1,1, 8] . . . . eContentType: ContentType OBJECT IDENTIFIER 1.3.6.1.5.5.7.12.2 (id_cct_PKIData)
65-4 [1,3, 751] . . . . eContent: [0] EXPLICIT OCTET STRING 751 bytes OPTIONAL
Π’Π£Π’ Π‘ΠΠΠΠ ΠΠΠΠΠ ΠΠΠΠΠΠ‘Π«ΠΠΠΠΠΠΠ Π€ΠΠΠΠ Π ΠΠΠΠΠ ΠΠ 751 Π±Π°ΠΉΡ
820 [1,2, 199] . . . signerInfos: SignerInfos SET OF
823 [1,2, 196] . . . . 0: SignerInfo SEQUENCE
826 [1,1, 1] . . . . . version: CMSVersion INTEGER v3 (03)
829 [0,0, 22] . . . . . sid: SignerIdentifier CHOICE subjectKeyIdentifier
[...]
956 [1,1, 64] . . . . . signature: SignatureValue OCTET STRING 64 bytes
. . . . . . C1:B3:88:BA:F8:92:1C:E6:3E:41:9B:E0:D3:E9:AF:D8
. . . . . . 47:4A:8A:9D:94:5D:56:6B:F0:C1:20:38:D2:72:22:12
. . . . . . 9F:76:46:F6:51:5F:9A:8D:BF:D7:A6:9B:FD:C5:DA:D2
. . . . . . F3:6B:00:14:A4:9D:D7:B5:E1:A6:86:44:86:A7:E8:C9
ΠΈ Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΉΠ» Ρ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ ΠΎΡ 65 Π±Π°ΠΉΡΠ°, Ρ Π΄ΡΠ»ΠΆΠΈΠ½Π° 751 Π±Π°ΠΉΡ. pyasn1 Π½Π΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ. ΠΠ΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Ρ.Π½Π°Ρ. TLVSeeker β ΠΌΠ°Π»ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° Π΅ΡΠΈΠΊΠ΅ΡΠΈ ΠΈ Π΄ΡΠ»ΠΆΠΈΠ½ΠΈ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ, Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° ΠΊΠΎΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π²Π°Ρ ΠΌΠ΅ "ΠΏΡΠ΅ΠΌΠΈΠ½ΠΈ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ Π΅ΡΠΈΠΊΠ΅Ρ", "Π²Π»Π΅Π· Π² Π΅ΡΠΈΠΊΠ΅ΡΠ°" (ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ Π² ΠΎΠ±Π΅ΠΊΡΠ° SEQUENCE), "ΠΏΡΠ΅ΠΌΠΈΠ½ΠΈ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ Π΅ΡΠΈΠΊΠ΅Ρ", "ΡΡΠΎΠ±ΡΠΈ ΡΠ²ΠΎΠ΅ΡΠΎ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°ΠΌΠ΅". Π’ΠΎΠ²Π° Π±Π΅ΡΠ΅ "ΡΡΡΠ½ΠΎ" ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΏΡΠ΅Π· ASN.1 DER-ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΠΎ ΡΠ°ΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ BER-ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π±Π°ΠΉΡΠΎΠ²Π°ΡΠ° Π½ΠΈΠ· OCTET STRING ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Π±ΠΈΠ»Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π° Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ°.
ΠΡΡΠ³ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ Π·Π° Π½Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ pyasn1 β Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΏΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, Π΄Π°Π»ΠΈ Π΄Π°Π΄Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ ΠΏΡΠΈΡΡΡΡΠ²Π° Π² SEQUENCE ΠΈΠ»ΠΈ Π½Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° ΡΡΠ΄ΡΡΠΆΠ° ΠΏΠΎΠ»Π΅ Field SEQUENCE OF Smth OPTIONAL, ΡΠΎ ΠΌΠΎΠΆΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄Π° ΠΎΡΡΡΡΡΠ²Π° Π² ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ (OPTIONAL) ΠΈΠ»ΠΈ Π΄Π° ΠΏΡΠΈΡΡΡΡΠ²Π°, Π½ΠΎ Π΄Π° Π΅ Ρ Π½ΡΠ»Π΅Π²Π° Π΄ΡΠ»ΠΆΠΈΠ½Π° (ΠΏΡΠ°Π·Π΅Π½ ΡΠΏΠΈΡΡΠΊ). Π ΠΎΠ±ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΎ. Π ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΡΡΡΠΈΠΊΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ Π½ΡΠΊΠΎΠΉ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Ρ ΡΠ΅Π½ΡΡΡ Π΅ ΠΈΠ·Π΄Π°Π» ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Ρ "Π½Π΅ ΡΡΠ²ΡΠ΅ΠΌ" Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ASN.1-ΡΡ Π΅ΠΌΠ° Π΄Π°Π½Π½ΠΈ! ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠΈΡΡ ΡΠ΅Π½ΡΡΡ "TΓRKTRUST Elektronik Sertifika Hizmet SaΔlayΔ±cΔ±sΔ±" Π² ΡΠ²ΠΎΡ ΠΊΠΎΡΠ΅Π½Π΅Π½ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π΅ ΠΈΠ·Π»ΡΠ·ΡΠ» ΠΈΠ·Π²ΡΠ½ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈΡΠ΅ Π³ΡΠ°Π½ΠΈΡΠΈ Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° subject β ΡΠΎΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΡΠ½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½ ΠΏΠΎ ΡΡ Π΅ΠΌΠ°ΡΠ°. DER ΠΊΠΎΠ΄Π΅ΠΊ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΠΎΠ»Π΅ΡΠΎ, ΡΠΈΡΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π΅ ΡΠ°Π²Π½Π° Π½Π° DEFAULT, Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΎ ΠΏΡΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ β Π² ΠΆΠΈΠ²ΠΎΡΠ° ΡΠ°ΠΊΠΈΠ²Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ ΡΡΠ΅ΡΠ°Ρ, ΠΈ ΠΏΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ PyDERASN Π΄ΠΎΡΠΈ ΠΎΡΡΠ·Π½Π°ΡΠΎ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΠ΅ ΡΠ°ΠΊΠΎΠ²Π° Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎ (ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° DER) ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π·Π°ΡΠ°Π΄ΠΈ ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ.
ΠΡΠ΅ Π΅Π΄Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ Π² ΠΊΠ°ΠΊΡΠ² ΡΠΎΡΠΌΠ°Ρ (BER/DER) Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π»Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΎΠ±Π΅ΠΊΡ Π² ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ°Π½Π΄Π°ΡΡΡΡ Π½Π° CMS ΡΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΎ Π² BER, Π½ΠΎ ΠΏΠΎΠ»Π΅ΡΠΎ signedAttrs, Π·Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠ°ΡΠ° ΠΏΠΎΠ΄ΠΏΠΈΡ, ΡΡΡΠ±Π²Π° Π΄Π° Π΅ Π² DER. ΠΠΊΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΠΌΠ΅ Ρ DER, ΡΠ΅ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°ΠΌΠ΅ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΡΠ°ΠΌΠ°ΡΠ° CMS, Π° Π°ΠΊΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΠΌΠ΅ Ρ BER, Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π² ΠΊΠ°ΠΊΡΠ² ΡΠΎΡΠΌΠ°Ρ Π΅ Π±ΠΈΠ»ΠΎ signedAttrs. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠ΅ ΡΡΡΠ±Π²Π° Ρ TLVSeeker (Π°Π½Π°Π»ΠΎΠ³, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π² pyasn1) Π΄Π° ΡΡΡΡΠΈΠΌ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΡΠΊΠΎ ΠΎΡ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° signedAttrs, ΠΈ Π½Π΅Π³ΠΎ ΠΎΡΠ΄Π΅Π»Π½ΠΎ, ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΡΠΎ ΠΎΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅, Π΄Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΠΌΠ΅ Ρ DER.
ΠΠ½ΠΎΠ³ΠΎ ΠΆΠ΅Π»Π°Π½Π°ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΠ»Π΅ΡΠ° DEFINED BY, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΡΠ΅ΡΠ°Ρ, Π±Π΅ΡΠ΅ Π²Π°ΠΆΠ½Π° Π·Π° Π½Π°Ρ. Π‘Π»Π΅Π΄ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ASN.1 ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ANY ΠΏΠΎΠ»Π΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ ΠΏΠΎ ΡΡ Π΅ΠΌΠ°, ΠΈΠ·Π±ΡΠ°Π½Π° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° OBJECT IDENTIFIER Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ Π² ΠΏΠΎΠ»Π΅ΡΠΎ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Π Python ΠΊΠΎΠ΄Π° ΡΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° if ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ° Π·Π° ANY ΠΏΠΎΠ»Π΅ΡΠΎ.
ΠΠΎΡΠ²Π°ΡΠ° Π½Π° PyDERASN
Π ΠΡΠ»Π°ΡΠ° ΡΠ΅Π΄ΠΎΠ²Π½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΎΡΠΊΡΠΈΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΈΠ·ΠΏΡΠ°ΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΠΎΠ²Π΅ Π½Π°Π³ΠΎΡΠ΅. Π pyasn1 Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΡΠΈ ΡΠΌΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π»ΠΈ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ, Π½ΠΎ ΠΊΠΎΠ΄ΡΡ Π½Π° pyasn1 Π½Π΅ Π΅ Π½Π°ΠΉ-Π»Π΅ΡΠ½ΠΈΡΡ Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π² Π½Π΅Π³ΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ Π° Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° API, ΠΊΠΎΠΈΡΠΎ Π½ΠΈ Π·Π°ΡΡΡΠ΄Π½ΡΠ²Π°Ρ Π°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΠ²ΠΈΠΊΠ½Π°Π»ΠΈ ΡΠΌΠ΅ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅ΡΡΠΎΠ²Π΅ Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅, ΠΊΠ°ΠΊΠ²ΠΎΡΠΎ Π»ΠΈΠΏΡΠ²Π°ΡΠ΅ Π² pyasn1.
Π Π΅Π΄ΠΈΠ½ Ρ ΡΠ±Π°Π² Π΄Π΅Π½ ΡΠ΅ΡΠΈΡ , ΡΠ΅ Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΡΠΏΡΠ° Π΄Π° ΡΡΡΠΏΡ ΡΠΎΠ²Π° ΠΈ Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Ρ __slot__-ΠΎΠ²Π΅, offset-ΠΈ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ blob-ΠΎΠ²Π΅! ΠΡΠΎΡΡΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ASN.1 ΠΊΠΎΠ΄Π΅ΠΊ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ β Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±Π΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ Π½Π°ΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ, Π° ΡΠΎΠ²Π° ΡΠ° ΡΡΠΎΡΠΈΡΠΈ Ρ ΠΈΠ»ΡΠ΄ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄, Π² ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±ΠΎΡΠ° Ρ ASN.1 ΡΡΡΡΠΊΡΡΡΠΈ. Π’ΠΎΠ΅ΡΡ, Π΅Π΄Π½ΠΎ ΠΎΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° Π½Π΅Π³ΠΎ Π΅: Π»Π΅ΡΠ½ΠΎΡΠ° Π² ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ΄ Π½Π° pyasn1. ΠΡΠ΅ΠΊΠ°ΡΠ°Ρ ΡΠ΅Π»ΠΈΡ ΡΠΈ ΠΎΡΠΏΡΡΠΊ, Π·Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΡΠ°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠΈΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΡΠΌ Π½Π΅Ρ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ 100%-Π½ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅, ΡΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°ΡΠ΅ ΠΈ ΠΏΡΠ»Π½Π° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°.
PyDERASN ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠΌΠ° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ 100%-Π½ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Ρ Π½Π΅Π²Π΅ΡΠΎΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° . ΠΡΠΎΠ²Π΅Π΄ΠΎΡ Π° ΡΠ΅ ΠΈ - Π½Π° 32-ΡΠ΄ΡΠ΅Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΠΎΡΡΠΈ Π½Π΅ Π½ΠΈ ΠΎΡΡΠ°Π²Π° ΠΊΠΎΠ΄ Π½Π° Python2, PyDERASN Π²ΡΠ΅ ΠΎΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Π½Π΅Π³ΠΎ ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΠΎΠΉ Π΅ ΡΠ΅ΡΡΠ²Π°Π½ ΡΠΏΡΡΠΌΠΎ .
ΠΡΠΈΠ½ΡΠΈΠΏΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½Π΅Π³ΠΎ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° pyasn1 β ΡΠ°Π±ΠΎΡΠ° Ρ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ Π½Π° Python ΠΎΠ±Π΅ΠΊΡΠΈ. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ASN.1 ΡΡ Π΅ΠΌΠΈ Π΅ ΡΡ ΠΎΠ΄Π½ΠΎ.
class TBSCertificate(Sequence):
schema = (
("version", Version(expl=tag_ctxc(0), default="v1")),
("serialNumber", CertificateSerialNumber()),
("signature", AlgorithmIdentifier()),
("issuer", Name()),
("validity", Validity()),
("subject", Name()),
("subjectPublicKeyInfo", SubjectPublicKeyInfo()),
("issuerUniqueID", UniqueIdentifier(impl=tag_ctxp(1), optional=True)),
("subjectUniqueID", UniqueIdentifier(impl=tag_ctxp(2), optional=True)),
("extensions", Extensions(expl=tag_ctxc(3), optional=True)),
)
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, PyDERASN ΠΈΠΌΠ° ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π½Π° ΡΡΡΠΎΠ³ ΡΠΈΠΏ. Π pyasn1, Π°ΠΊΠΎ ΠΏΠΎΠ»Π΅ ΠΈΠΌΠ°ΡΠ΅ ΡΠΈΠΏ CMSVersion(INTEGER), ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠΈ int ΠΈΠ»ΠΈ INTEGER. PyDERASN ΡΡΡΠΎΠ³ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡΡ ΠΎΠ±Π΅ΠΊΡ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ CMSVersion. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄ Π½Π° Python3, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈ , Π·Π°ΡΠΎΠ²Π° Π² Π½Π°ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΡΠΌΠ° Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° def func(serial, contents), Π° def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), ΠΈ PyDERASN ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄.
Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² PyDERASN ΠΈΠΌΠ° ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΈ ΠΎΡΡΡΡΠΏΠΊΠΈ ΠΎΡ ΡΠ°ΠΌΠ°ΡΠ° ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ. pyasn1 Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π² SubjectKeyIdentifier().subtype(implicitTag=Tag(β¦)) ΠΏΠΎΠ»Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠΈ SubjectKeyIdentifier() ΠΎΠ±Π΅ΠΊΡ (Π±Π΅Π· Π½ΡΠΆΠ½ΠΈΡ IMPLICIT TAG) ΠΈ ΡΠ΅ΡΡΠΎ ΡΠ΅ Π½Π°Π»Π°Π³Π°ΡΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Ρ ΠΈ ΠΏΡΠ΅ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΎΠ±Π΅ΠΊΡΠΈ ΡΠ°ΠΌΠΎ Π·Π°ΡΠ°Π΄ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ IMPLICIT/EXPLICIT ΡΠ°Π³ΠΎΠ²Π΅. PyDERASN ΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΡΠ°ΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΡΠΈΠΏ β ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅ ΡΠΎΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²Ρ ΠΎΡ Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠ°ΡΠ° ΡΡ Π΅ΠΌΠ° Π½Π° ASN.1 ΡΡΡΡΠΊΡΡΡΠ°. Π’ΠΎΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠΎΡΡΡΠ²Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°.
ΠΠΊΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π³ΡΠ΅ΡΠΊΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅, Π² pyasn1 Π½Π΅ Π΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΡΠ΄Π΅ ΡΠΎΡΠ½ΠΎ Π΅ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Π»Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΡΡΡΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°ΠΊΠ°Π²Π° Π³ΡΠ΅ΡΠΊΠ°: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (at 138) unsatisfied bounds: 1 β 77 β 64. ΠΠΎΠ³Π°ΡΠΎ Ρ ΠΎΡΠ°ΡΠ° ΠΏΠΈΡΠ°Ρ ASN.1 ΡΡΡΡΠΊΡΡΡΠΈ, ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ±ΡΡΠΊΠ°Ρ ΠΈ ΡΠΎΠ²Π° ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Ρ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΡΠ½ΡΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ Π½Π° ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Π°ΡΠ° ΡΡΡΠ°Π½Π°.
Π ΠΏΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ PyDERASN Π½ΡΠΌΠ°ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° BER-ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅. Π’Ρ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° UTCTime/GeneralizedTime Ρ ΡΠ°ΡΠΎΠ²ΠΈ Π·ΠΎΠ½ΠΈ. Π’ΠΎΠ²Π° ΡΠ΅ Π΄ΠΎΠΉΠ΄Π΅ Π² Π±ΡΠ΄Π΅ΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅ ΠΏΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅.
Π ΠΏΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π΅ Π±Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ ΠΏΠΎΠ»Π΅ΡΠ°, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΎΡ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ°. Π‘Π»Π΅Π΄ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΡΠ°Π·ΠΈ ΠΈ Π·Π°ΠΏΠΎΡΠ½Π° Π°ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠΊΡΠ°ΡΠ°Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° β Ρ Π΅Π΄Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ»Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ°, ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½Π° Π΄ΡΠ»Π±ΠΎΠΊΠΎ. ΠΠ° ΡΠΎΠ²Π°, Π² ΡΡ Π΅ΠΌΠ°ΡΠ° ΡΠ΅ Π·Π°Π΄Π°Π²Π°Ρ ΠΊΠΎΠΈ ΠΏΠΎΠ»Π΅ΡΠ° ΠΊΠ°ΠΊΠ²ΠΎ Β«ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΒ». ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΡ Π΅ΠΌΠ°ΡΠ° CMS:
class ContentInfo(Sequence):
schema = (
("contentType", ContentType(defines=((("content",), {
id_authenticatedData: AuthenticatedData(),
id_digestedData: DigestedData(),
id_encryptedData: EncryptedData(),
id_envelopedData: EnvelopedData(),
id_signedData: SignedData(),
}),))),
("content", Any(expl=tag_ctxc(0))),
)
ΡΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π°ΠΊΠΎ contentType ΡΡΠ΄ΡΡΠΆΠ° OID ΡΡΡ ΡΡΠΎΠΉΠ½ΠΎΡΡ id_signedData, ΡΠΎ ΠΏΠΎΠ»Π΅ΡΠΎ content (Π½Π°ΠΌΠΈΡΠ°ΡΠΎ ΡΠ΅ Π² ΡΡΡΠ°ΡΠ° SEQUENCE) ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΎ ΠΏΠΎ ΡΡ Π΅ΠΌΠ°ΡΠ° SignedData. ΠΠ°ΡΠΎ ΠΈΠΌΠ° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΊΠΎΠ±ΠΊΠΈ? ΠΠΎΠ»Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Β«ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΒ» Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎΠ»Π΅ΡΠ° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΡΠΈ ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅ EnvelopedData. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»Π΅ΡΠ° ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΠΏΠΎ ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡ decode path β ΡΠΎΠΉ Π·Π°Π΄Π°Π²Π° ΡΠΎΡΠ½ΠΎΡΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΡΡΡΡΠΊΡΡΡΠΈ.
ΠΠ΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½ΠΎ ΠΈΠ»ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ ΡΠ΅Π·ΠΈ defines Π² ΡΡ Π΅ΠΌΠ°ΡΠ°. ΠΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ OID-ΠΈΡΠ΅ ΠΈ ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅ ΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΡΠ°ΠΌΠΎ Π² ΡΡΡΠ°Π½ΠΈΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ. PyDERASN ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ defines ΡΠΎΡΠ½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°:
ContentInfo().decode(data, ctx={"defines_by_path": ((
(
"content", DecodePathDefBy(id_signedData),
"certificates", any, "certificate", "tbsCertificate",
"extensions", any, "extnID",
),
((("extnValue",), {
id_ce_authorityKeyIdentifier: AuthorityKeyIdentifier(),
id_ce_basicConstraints: BasicConstraints(),
[...]
id_ru_subjectSignTool: SubjectSignTool(),
}),),
),)})
Π’ΡΠΊ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΠ΅ Π² CMS SignedData Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΈΠΊΠ°ΡΠ΅Π½ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Ρ Π½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool ΠΈ Π΄Ρ.). Π£ΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΡΡΠ΅Π· decode path Π½Π° ΠΊΠΎΠΉ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΡΡΡΠ±Π²Π° Π΄Π° Β«ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΠΌΒ» defines, ΡΡΠΊΠ°Ρ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ Π² ΡΡ Π΅ΠΌΠ°ΡΠ°.
ΠΠ°ΠΊΡΠ°Ρ, PyDERASN ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΠΎΡ Π·Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ASN.1 ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π° Ρ Π±ΠΎΠ³Π°ΡΠΎ . ΠΠΎΠΆΠ΅ Π΄Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ASN.1 ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΡΠΎΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡ Π΅ΠΌΠ° ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:

ΠΠΎΠΊΠ°Π·Π²Π°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΠ°Π³, Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ, Π½Π°Π»ΠΈΡΠ½ΠΎΡΡ Π½Π° EOC (ΠΊΡΠ°ΠΉ Π½Π° ΠΎΠΊΡΠ΅ΡΠΈΡΠ΅), ΠΏΡΠΈΠ·Π½Π°ΠΊ Π·Π° BER ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅, ΠΏΡΠΈΠ·Π½Π°ΠΊ Π·Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Ρ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°, Π΄ΡΠ»ΠΆΠΈΠ½Π° ΠΈ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° EXPLICIT ΡΠ°Π³ (Π°ΠΊΠΎ ΠΈΠΌΠ°), Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π° Π½Π° Π²Π»ΠΎΠΆΠ΅Π½ΠΎΡΡ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° Π² ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅, IMPLICIT/EXPLICIT ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΠ°Π³Π°, ΠΈΠΌΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° ΠΏΠΎ ΡΡ
Π΅ΠΌΠ°ΡΠ°, Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π΅Π½ ASN.1 ΡΠΈΠΏ, ΠΏΠΎΡΠ΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ Π² SEQUENCE/SET OF, ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° CHOICE (Π°ΠΊΠΎ ΠΈΠΌΠ°), ΡΠ΅ΡΠΈΠΌΠΎ ΠΈΠΌΠ΅ Π½Π° INTEGER/ENUMERATED/BIT STRING ΠΏΠΎ ΡΡ
Π΅ΠΌΠ°ΡΠ°, ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° Π²ΡΡΠΊΠ°ΠΊΡΠ² ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΡΠΈΠΏ, DEFAULT/OPTIONAL ΡΠ»Π°Π³ ΠΎΡ ΡΡ
Π΅ΠΌΠ°ΡΠ°, ΠΏΡΠΈΠ·Π½Π°ΠΊ, ΡΠ΅ ΠΎΠ±Π΅ΠΊΡΡΡ Π΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½ ΠΊΠ°ΡΠΎ DEFINED BY ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΡΠ² OID Π΅ ΡΡΠ°Π½Π°Π»ΠΎ, ΡΠ΅ΡΠΈΠΌ OID.
Π‘ΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΊΡΠ°ΡΠΈΠ²ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π° ΡΠ°ΠΊΠ°, ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ PP ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ Ρ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°. ΠΠ° ΡΠΊΡΠΈΠΉΠ½ΡΠΎΡΠ° Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΡΠ΅Π½Π΄Π΅ΡΠ° Π² ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΡΠ²Π΅ΡΠ΅Π½ ΡΠ΅ΠΊΡΡ. ΠΠΌΠ° ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈ Π² JSON/HTML ΡΠΎΡΠΌΠ°Ρ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠ° Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ° ASN.1 ΠΊΠ°ΡΠΎ Π² ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΡΡΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
Π’ΠΎΠ²Π° Π½Π΅ Π±Π΅ΡΠ΅ ΡΠ΅Π»ΡΠ°, Π½ΠΎ PyDERASN ΡΡΠ°Π½Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΡ pyasn1. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° CRL ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡΠ½ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡΠ΅ Π·Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ (Π±ΡΡΠ·ΠΈ) ΠΈ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. pyasn1 Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ° CRL Π½Π° ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ Π·Π° Π½Π°Π΄ 20 ΠΌΠΈΠ½ΡΡΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ PyDERASN ΡΠ°ΠΌΠΎ Π·Π° 28 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ! ΠΠΌΠ° ΠΏΡΠΎΠ΅ΠΊΡ , Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ Π±ΡΡΠ·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ ΡΡΡΡΠΊΡΡΡΠΈ: ΡΠΎΠΉ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ° (ΠΏΡΠ»Π½ΠΎ, Π½Π΅ ΠΌΡΡΠ·Π΅Π»ΠΈΠ²ΠΎ) ΡΡΡΠΈΡ CRL Π·Π° 29 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π½ΠΎ ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ° ΠΏΠΎΡΡΠΈ Π΄Π²Π° ΠΏΡΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΏΠΎΠ΄ Python3 (983 MiB ΡΡΠ΅ΡΡ 498), ΠΈ 3.5 ΠΏΡΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ Python2 (1677 ΡΡΠ΅ΡΡ 488), Π΄ΠΎΠΊΠ°ΡΠΎ pyasn1 ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ° ΡΠ΅Π»ΠΈ 4.3 ΠΏΡΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ (2093 ΡΡΠ΅ΡΡ 488).
asn1crypto, ΠΊΠΎΠΉΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ , Π½Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅, Π·Π°ΡΠΎΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π±Π΅ΡΠ΅ Π² Π½Π°ΡΠ°Π»Π΅Π½ ΡΡΠ°Π΄ΠΈΠΉ ΠΈ Π½Π΅ Π±ΡΡ ΠΌΠ΅ ΡΡΠ»ΠΈ Π·Π° Π½Π΅Π³ΠΎ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΡΡΠΎ Π½Π΅ Π±ΠΈΡ ΠΌΠ΅ ΡΠ΅ Π½Π°ΡΠΎΡΠΈΠ»ΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²Π΅Π΄Π½Π°Π³Π° Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ , ΡΠ΅ ΡΡΡΠΈΡΡ GeneralizedTime Π½Π΅ ΠΏΡΠΈΠ΅ΠΌΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠΎΡΠΌΠ°Ρ, Π° ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ»ΡΠ°Π»ΠΈΠ²ΠΎ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π° Π΄ΠΎΠ»ΠΈ ΠΎΡ ΡΠ΅ΠΊΡΠ½Π΄Π°ΡΠ°. Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ X.509 ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ, Π½ΠΎ Π² ΠΎΠ±ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΎ.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° PyDERASN Π΅ Π½Π°ΠΉ-ΡΡΡΠΎΠ³ΠΈΡΡ ΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΠ΅ ΠΌΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠΈ Π½Π° Python/Go DER. Π encoding/asn1 Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π½Π° Π»ΡΠ±ΠΈΠΌΠΈΡ ΠΌΠΈ Go ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΡΡΡΠΎΠΊΠ° UTCTime/GeneralizedTime. ΠΠΎΡΠΎΠΉ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΡΠΎΠ³ΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ (Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΈΠ·-Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΡΠΎ ΡΡΠ°ΡΡΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΡΠ°Π²Π»ΡΡΡ), ΠΏΠΎΡΡΠΎΠΌΡ Π² PyDERASN Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΎΠ±Π»Π΅ΠΊΡΠ°Π²Π°ΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
ΠΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ ΡΡΡΠ΅ΠΌΠΈ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΠΏΡΠΎΡΡ. Π¦ΡΠ»Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΅ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ». ΠΠΎΠ΄ΡΡ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Ρ Π°ΠΊΡΠ΅Π½Ρ Π½Π° ΠΏΡΠΎΡΡΠΎΡΠ° Π½Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ, Π±Π΅Π· ΠΈΠ·Π»ΠΈΡΠ½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈ DRY ΠΊΠΎΠ΄. ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ , Π² Π½Π΅Π³ΠΎ Π½ΡΠΌΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΡΠ»Π½ΠΎΠΏΡΠ°Π²Π½ΠΎ BER Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° UTCTime/GeneralizedTime Π½ΠΈΠ·ΠΎΠ²Π΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΠΈ Π½ΠΈΠ·ΠΎΠ²Π΅ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ. ΠΡΠ² Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΡΠ»ΡΡΠ°ΠΈ, Π»ΠΈΡΠ½ΠΎ Π·Π° ΠΌΠ΅Π½ Π½ΡΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΄ΡΡΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² Python.
ΠΠ°ΠΊΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΌΠΎΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠΈΠΏΠ° , , , , PyDERASN Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ , ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π°Π½ ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π½Π° , ΠΈ Π΅ Π½Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ ΡΠ²Π°Π»ΡΠ½Π΅. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈΠΌΠ° ΠΈ Π² .
, , ΡΠ»Π΅Π½ Π½Π° , Python/Go-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ, Π³Π»Π°Π²Π΅Π½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
