{"id":302150,"date":"2020-04-19T21:00:25","date_gmt":"2020-04-19T21:00:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=302150"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-04-19T21:00:25","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=302150","title":{"rendered":"PyDERASN: \u043a\u0430\u043a \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b big-data \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/498014\/\">\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043e <a href=\"https:\/\/habr.com\/ru\/post\/444272\/\">PyDERASN<\/a> \u2014 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c ASN.1 DER\/CER\/BER \u043a\u043e\u0434\u0435\u043a\u0435 \u043d\u0430 Python. \u0417\u0430 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0439 \u0433\u043e\u0434, \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043a\u0440\u043e\u043c\u0435 \u0432\u0441\u044f\u043a\u0438\u0445 \u043c\u0435\u043b\u043e\u0447\u0435\u0439, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439, \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0445\u043e\u0442\u044f \u0438 \u043f\u0440\u0435\u0436\u0434\u0435 \u043e\u043d \u0431\u044b\u043b \u0443\u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0441\u0442\u0440\u043e\u0433\u0438\u043c \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u0435\u043a\u043e\u0432), \u0432 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0451\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u044e\u0449\u0438\u0445 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/241\/bae\/4fc\/241bae4fcfb5d7f0c3a605bf5f3211cb.png\" alt=\"ASN.1 browser\"><\/div>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\/\u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<ul>\n<li><strong>\u041e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 CRL<\/strong>:<br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0446\u0435\u043d\u0442\u0440 (CA) \u0438 \u0443 \u043d\u0430\u0441 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0438\u043b\u0438 \u0441\u043e\u0442\u043d\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 X.509 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. \u0418 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 CRL (certificate revocation list). CRL \u0444\u0430\u0439\u043b CACert.org, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 8.72 MiB, \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 PyDERASN-\u043e\u043c \u043f\u043e\u0434 Python 3.6 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u0430 (\u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 <em>asn1crypto<\/em> \u0438 <em>pyasn1<\/em> \u0438 \u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435). \u0410 \u0442\u0430\u043c \u0432\u0435\u0434\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 416 \u0442\u044b\u0441. \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. \u041d\u0443\u0436\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0438\u043b\u0438 \u0441\u043e\u0442\u043d\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. \u0423\u0434\u0440\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0444\u0430\u043a\u0442.  <\/li>\n<li><strong>\u041e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 CMS<\/strong>:<br \/>  CMS (Cryptographic Message Syntax) \u044d\u0442\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f<br \/>  \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445\/\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445\/\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<br \/>  <em>SignedData<\/em> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0432 \u043d\u0435\u0439,<br \/>  \u043a\u0430\u043a \u0432 \u043c\u0430\u0442\u0440\u0451\u0448\u043a\u0435, \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c <em>EnvelopedData<\/em> \u0441<br \/>  \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c.\n<p>  \u0423 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u0445 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 CMS. \u0414\u0430, CMS \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c detached data, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0414\u043b\u044f 10 GiB \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 \u043d\u0443\u0436\u043d\u043e 20 GiB \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c: \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441 \u044d\u0442\u0438\u043c 10 GiB \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u0434\u043b\u044f \u0435\u0451 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b. \u041f\u0440\u0438\u0441\u043a\u043e\u0440\u0431\u043d\u043e.  <\/li>\n<\/ul>\n<h2>\u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u0430\u043a\u0438<\/h2>\n<p>  \u041a\u0430\u043a\u0438\u0435 ASN.1 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0451\u043c\u043a\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438? \u0422\u043e\u043b\u044c\u043a\u043e <em>SEQUENCE OF<\/em>\/<em>SET OF<\/em>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 CACert.org), \u0438 \u0432\u0441\u0435 \u0432\u0438\u0434\u044b <em>*STRING<\/em>-\u043e\u0432 (\u043a\u0430\u043a \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435). \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0434\u043e\u0431\u0440\u043e\u0434\u0435\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u044c (\u043f\u043e \u041b\u0430\u0440\u0440\u0438 \u0423\u043e\u043b\u043b\u0443), \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0451\u043c\u043a\u043e\u0441\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u043e\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>  <em>*STRING<\/em> \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0435\u043a\u0430, \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0438 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u043e\u0431\u0449\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0427\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 <em>OCTET STRING<\/em> \u0432 DER?  <\/p>\n<pre> return tag + len_encode(len(value)) + value <\/pre>\n<p>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e <em>value<\/em> \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0442 \u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u044b\u0442\u044c bytes-like \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443. <em>memoryview<\/em> \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u044d\u0442\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u0410 \u0435\u0449\u0451 <em>memoryview<\/em> \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442 <em>mmap<\/em> \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0447\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 20 GiB \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f 10 GiB CMS \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <em>OCTET STRING<\/em>-\u0430 (\u0438\u043b\u0438 \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 <em>*STRING<\/em>-\u043e\u0432) \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 <em>memoryview<\/em>. \u0414\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432 PyDERASN \u0435\u0441\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:  <\/p>\n<pre> from pyderasn import file_mmaped with open(&quot;dump.sql.zst&quot;, &quot;rb&quot;) as fd:     ... = OctetString(file_mmaped(fd)) <\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e <em>memoryview<\/em> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f decode:  <\/p>\n<pre> from pyderasn import file_mmaped with open(&quot;dump.sql.zst&quot;, &quot;rb&quot;) as fd:     obj = Schema.decode(file_mmaped(fd)) <\/pre>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 <em>*STRING<\/em> \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0439. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e CRL. \u0427\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430?  <\/p>\n<pre> CertificateList SEQUENCE . tbsCertList: TBSCertList SEQUENCE . . version: Version INTEGER v2 (01) OPTIONAL . . signature: AlgorithmIdentifier SEQUENCE . . issuer: Name CHOICE rdnSequence . . thisUpdate: Time CHOICE utcTime . . nextUpdate: Time CHOICE utcTime OPTIONAL . . revokedCertificates: RevokedCertificates SEQUENCE OF OPTIONAL . . . 0: RevokedCertificate SEQUENCE . . . . userCertificate: CertificateSerialNumber INTEGER 17 (11) . . . . revocationDate: Time CHOICE utcTime UTCTime 2003-04-01T14:25:08 . . . 1: RevokedCertificate SEQUENCE . . . . userCertificate: CertificateSerialNumber INTEGER 20 (14) . . . . revocationDate: Time CHOICE utcTime UTCTime 2002-10-01T02:18:01                                   [...]  . . . 415753: RevokedCertificate SEQUENCE . . . . userCertificate: CertificateSerialNumber INTEGER 1341859 (14:79:A3) . . . . revocationDate: Time CHOICE utcTime UTCTime 2020-02-08T06:51:56 . . . 415754: RevokedCertificate SEQUENCE . . . . userCertificate: CertificateSerialNumber INTEGER 1341860 (14:79:A4) . . . . revocationDate: Time CHOICE utcTime UTCTime 2020-02-08T06:53:01 . . . 415755: RevokedCertificate SEQUENCE . . . . userCertificate: CertificateSerialNumber INTEGER 1341861 (14:79:A5) . . . . revocationDate: Time CHOICE utcTime UTCTime 2020-02-08T07:25:06 . signatureAlgorithm: AlgorithmIdentifier SEQUENCE . signatureValue: BIT STRING 4096 bits <\/pre>\n<p>  \u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 <em>RevokedCertificate<\/em> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0432\u0441\u0435\u0433\u043e-\u043b\u0438\u0448\u044c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u043e\u0442\u0437\u044b\u0432\u0430. \u0427\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e DER \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435?  <\/p>\n<pre> value = b&quot;&quot;.join(revCert.encode() for revCert in revCerts) return tag + len_encode(len(value)) + value <\/pre>\n<p>  \u041f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f DER \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u041d\u0443\u0436\u043d\u043e \u043b\u0438 \u043d\u0430\u043c \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e \u0445\u043e\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0432 15 \u0431\u0430\u0439\u0442 DER \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f? \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\/\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CRL \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0421\u0423\u0411\u0414:  <\/p>\n<pre> def revCertsGenerator(...):     for row in db.cursor:         yield RevokedCertificate((             (&quot;userCertificate&quot;, CertificateSerialNumber(row.serial)),             (&quot;revocationDate&quot;, Time((&quot;utcTime&quot;, UTCTime(row.revdate)))),         ))  crl[&quot;tbsCertList&quot;][&quot;revokedCertificates&quot;] = revCertsGenerator() <\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e CRL \u2014 \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u0441\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0435\u0433\u043e DER \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c: \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0440\u0435\u0447\u044c \u043e \u043f\u0430\u0440\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 (\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0432\u0435\u0441 \u043f\u043e\u043b\u0443\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 RevokedCertificate \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432). \u041d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u044b <em>SEQUENCE OF<\/em>\/<em>SET OF<\/em> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0430 \u043d\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DER<\/h2>\n<p>  \u041e\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0412\u0435\u0434\u044c \u044d\u0442\u043e \u0436\u0435 DER \u2014 \u0434\u043b\u0438\u043d\u044b \u0432\u0441\u0435\u0445 TLV (tag + length + value) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435!<\/p>\n<p>  \u041d\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b \u0442\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c! \u0412\u0435\u0434\u044c \u043d\u0430\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e 10 GiB \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f DER \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043f\u0438\u0438 \u0411\u0414: <em>raw = cms.encode()<\/em>! \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u0438\u0439 <em>writer<\/em>, \u043a\u0443\u0434\u0430 \u0431\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c placeholder-\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0434\u043b\u0438\u043d \u0438 \u043f\u043e\u0442\u043e\u043c \u0438\u0445 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f seek? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u043b\u0438\u043d\u0430 \u0434\u043b\u0438\u043d\u044b (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 placeholder) \u0442\u043e\u0436\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430.<\/p>\n<p>  PyDERASN \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0445\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0433\u043e DER \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u0435 \u043e \u0434\u043b\u0438\u043d\u0430\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <strong>\u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435<\/strong> \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DER \u0432 \u043d\u0435\u043a\u0438\u0439 <em>writer<\/em>, \u0443\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u0434\u043b\u0438\u043d\u0430\u0445. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043b\u0438\u0448\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0434\u0432\u0443\u0445\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 ASN.1 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0445\u043e\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c (D \u2014 distinguished!), \u0442\u043e, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u0438\u043d, \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443, \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d. \u0423 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u0438\u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0423 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 (<em>SEQUENCE<\/em>\/<em>SET<\/em>, <em>SEQUENCE OF<\/em>\/<em>SET OF<\/em>, <em>EXPLICIT TAG<\/em>). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<pre> revCert = RevokedCertificate((     (&quot;userCertificate&quot;, CertificateSerialNumber(123)),     (&quot;revocationDate&quot;, Time((&quot;utcTime&quot;, UTCTime(datetime.utcnow())))), )) revs = RevokedCertificates([revCert, revCert])  (42, [40, 18, 18]) <\/pre>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 <em>RevokedCertificate<\/em> \u0438 \u0432\u0441\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. \u0414\u043b\u0438\u043d\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0432 DER \u043e\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b) \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0437\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e. \u0412 \u0438\u0442\u043e\u0433\u0435, \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e CACert.org CRL \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 3.5 MiB, \u0430 \u0434\u043b\u044f \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u043e\u0433\u043e CMS, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c \u0432\u0435\u0441 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043a\u043e\u043f\u0438\u0435\u0439 \u0411\u0414, \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 0.5 KiB.<\/p>\n<p>  \u0414\u0432\u0443\u0445\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438:  <\/p>\n<pre> fulllen, state = obj.encode1st() with open(&quot;result&quot;, &quot;wb&quot;) as fd:     obj.encode2nd(fd.write, iter(state)) <\/pre>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0435\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c <em>posix_fallocate<\/em> \u0432\u044b\u0437\u043e\u0432\u043e\u043c.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>encode2pass(obj)<\/em> \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0432\u0443\u0445\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0417\u0430\u0447\u0435\u043c? \u041e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u043e \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0451\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 CACert.org CRL, \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f 416k+ \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c\u044b\u0445 <em>b&quot;&quot;.join()<\/em> \u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e, \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0435\u0434\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u0430.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 CMS \u0432 DER, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 CRL \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u0441\u044f\u043a\u043d\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c? \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043d\u043e\u0432\u0430!  <\/p>\n<pre> _, state = crl.encode1st() crl[&quot;tbsCertList&quot;][&quot;revokedCertificates&quot;] = revCertsGenerator() crl.encode2nd(writer, iter(state)) <\/pre>\n<p>  \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043c\u044b <strong>\u043e\u0431\u044f\u0437\u0430\u043d\u044b<\/strong> \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0447\u044c-\u0432-\u0442\u043e\u0447\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432, \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0431\u0438\u0442\u044b\u0439 DER. \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0421\u0423\u0411\u0414, \u0442\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e <em>REPEATABLE READ<\/em> \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443.<\/p>\n<h2>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: CER<\/h2>\n<p>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, DER (distinguished encoding rules) \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e BER (basic encoding rules), \u0436\u0451\u0441\u0442\u043a\u043e \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445. \u041d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e BER: CER (canonical encoding rules). \u041a\u0430\u043a \u0438 DER, \u043e\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. CER \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 DER \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u0435\u043b\u043e\u0447\u0430\u043c\u0438, \u043d\u043e \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, CER \u043d\u0435 \u0441\u0442\u0430\u043b \u0442\u0430\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u043a\u0430\u043a DER.<\/p>\n<p>  \u041e\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0431\u0440\u043e\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u044f (\u0442\u0438\u043f\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u044d\u0433\u043e\u0432 \u0432 SET), CER \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 DER:<\/p>\n<ul>\n<li>\u0414\u043b\u0438\u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (constructed, \u043d\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445) \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f indefinite \u043c\u0435\u0442\u043e\u0434\u043e\u043c (<em>LENINDEF<\/em> \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 PyDERASN). \u0422\u043e \u0435\u0441\u0442\u044c, \u0434\u043b\u044f <em>SEQUENCE<\/em>\/<em>SET<\/em>, <em>SEQUENCE OF<\/em>\/<em>SET OF<\/em>, <em>EXPLICIT TAG<\/em>-\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<br \/> \n<pre> TAG_CONSTRUCTED || LEN(VALUE) || VALUE <\/pre>\n<p>  \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>LENINDEF<\/em> (0x80) \u0438 EOC (\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0442\u044d\u0433, \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b) \u043a\u0430\u043a \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f:  <\/p>\n<pre> TAG_CONSTRUCTED || 80 || VALUE || 00 00 <\/pre>\n<p>  <\/li>\n<li><em>*STRING<\/em>-\u0438, \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 1000-\u0431\u0430\u0439\u0442, \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f chunk-\u0430\u043c\u0438 \u043f\u043e 1000-\u0431\u0430\u0439\u0442. \u0422\u0435, \u0443 \u043a\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u0430, \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e DER. \u0422\u0430\u043a, 512 \u0431\u0430\u0439\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 DER:<br \/> \n<pre> TAG_PRIMITIVE || LEN(512) || 512B <\/pre>\n<p>  \u0430 2048 \u0431\u0430\u0439\u0442 \u0441\u0442\u0440\u043e\u043a\u0430:  <\/p>\n<pre> TAG_CONSTRUCTED || 80 ||     TAG_PRIMITIVE || LEN(1000) || 1000B ||     TAG_PRIMITIVE || LEN(1000) || 1000B ||     TAG_PRIMITIVE || LEN(48) || 48B || 00 00 <\/pre>\n<p>  <\/li>\n<\/ul>\n<p>  \u0412\u0441\u0451 \u044d\u0442\u043e (\u043f\u043b\u044e\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043b\u043e\u0447\u0435\u0439) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e (\u0441 1000 \u0431\u0430\u0439\u0442 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a) \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>mmap<\/em> \u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 CER \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u043c <em>.encode_cer(writer)<\/em> \u043c\u0435\u0442\u043e\u0434\u0430. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, PyDERASN \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c CER \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a BER.<\/p>\n<p>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442 CMS, \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0447\u0438\u043c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 BER (\u0438 DER, \u0438 CER, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f BER). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0448\u0443 \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0411\u0414 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 CER CMS \u0431\u0435\u0437 \u0434\u0432\u0443\u0445\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0433\u043e DER. <strong>\u041e\u0434\u043d\u0430\u043a\u043e<\/strong>, <em>SignedData<\/em> \u043e\u0431\u044f\u0437\u0430\u043d \u0438\u043c\u0435\u0442\u044c <em>SignedAttributes<\/em> \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 DER, \u043a\u0430\u043a \u0438 X.509 <em>Certificate<\/em> \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. PyDERASN \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 DER \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f <em>der_forced = True<\/em> \u0430\u0442\u0440\u0438\u0431\u0443\u0442.<\/p>\n<h2>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: evgen-\u0440\u0435\u0436\u0438\u043c<\/h2>\n<p>  \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c, \u0430 \u0432\u043e\u0442 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <em>mmap<\/em>. \u00ab\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439\u00bb \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u0443\u0447\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u00ab\u0434\u0430\u0439 \u043c\u043d\u0435 \u0435\u0449\u0451 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb, \u00ab\u0432\u043e\u0442 \u0442\u0435\u0431\u0435\u00bb, \u043d\u0435\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u0431\u044b \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0438 PyDERASN-\u0430. \u0414\u0430 \u0438, \u043b\u0438\u0447\u043d\u043e \u044f, \u043d\u0435 \u0432\u0438\u0436\u0443 \u0431\u044b\u043b \u0431\u044b \u043e\u043d \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0410 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 (constructed), \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435, \u0438 \u0442.\u0434\u2026 \u041c\u044b \u043a\u043e\u043f\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u0437 \u043d\u0438\u0445 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0438, \u0434\u043e\u0439\u0434\u044f \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u0430, \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u0430\u043c \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u00ab\u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c\u00bb \u0432\u0441\u0435 \u0432\u0438\u0434\u044b <strong>\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0443\u043a\u0430\u0445? \u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432 PyDERASN \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0430\u043a\u0438\u0445 \u00ab\u0441\u043e\u0431\u044b\u0442\u0438\u0439\u00bb (event generation, evgen).<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u043c evgen-\u0440\u0435\u0436\u0438\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e CACert.org CRL, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:  <\/p>\n<pre> $ python -m pyderasn --schema tests.test_crl:CertificateList --evgen revoke.crl [\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435][T,L,  V len]      10   [1,1,      1]   . . version: Version INTEGER v2 (01) OPTIONAL      15   [1,1,      9]   . . . algorithm: OBJECT IDENTIFIER 1.2.840.113549.1.1.13      26   [0,0,      2]   . . . parameters: [UNIV 5] ANY OPTIONAL      13   [1,1,     13]   . . signature: AlgorithmIdentifier SEQUENCE      34   [1,1,      3]   . . . . . . type: AttributeType OBJECT IDENTIFIER 2.5.4.10      39   [0,0,      9]   . . . . . . value: [UNIV 19] AttributeValue ANY      32   [1,1,     14]   . . . . . 0: AttributeTypeAndValue SEQUENCE      30   [1,1,     16]   . . . . 0: RelativeDistinguishedName SET OF                                   [...]      188   [1,1,      1]   . . . . userCertificate: CertificateSerialNumber INTEGER 17 (11)     191   [1,1,     13]   . . . . . utcTime: UTCTime UTCTime 2003-04-01T14:25:08     191   [0,0,     15]   . . . . revocationDate: Time CHOICE utcTime     191   [1,1,     13]   . . . . . utcTime: UTCTime UTCTime 2003-04-01T14:25:08     186   [1,1,     18]   . . . 0: RevokedCertificate SEQUENCE     208   [1,1,      1]   . . . . userCertificate: CertificateSerialNumber INTEGER 20 (14)     211   [1,1,     13]   . . . . . utcTime: UTCTime UTCTime 2002-10-01T02:18:01     211   [0,0,     15]   . . . . revocationDate: Time CHOICE utcTime     206   [1,1,     18]   . . . 1: RevokedCertificate SEQUENCE                                   [...]  9144992   [0,0,     15]   . . . . revocationDate: Time CHOICE utcTime 9144985   [1,1,     20]   . . . 415755: RevokedCertificate SEQUENCE     181   [1,4,9144821]   . . revokedCertificates: RevokedCertificates SEQUENCE OF OPTIONAL       5   [1,4,9144997]   . tbsCertList: TBSCertList SEQUENCE 9145009   [1,1,      9]   . . algorithm: OBJECT IDENTIFIER 1.2.840.113549.1.1.13 9145020   [0,0,      2]   . . parameters: [UNIV 5] ANY OPTIONAL 9145007   [1,1,     13]   . signatureAlgorithm: AlgorithmIdentifier SEQUENCE 9145022   [1,3,    513]   . signatureValue: BIT STRING 4096 bits       0   [1,4,9145534]  CertificateList SEQUENCE <\/pre>\n<ul>\n<li>\u041f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u0432\u0438\u0434\u0435\u043b\u0438 <em>CertificateList<\/em> <em>SEQUENCE<\/em> \u0442\u044d\u0433, \u0434\u043b\u0438\u043d\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0435\u0449\u0451 \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u041f\u043e\u043a\u0430 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043d\u0438\u043c.<\/li>\n<li>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e <em>SEQUENCE<\/em>: \u043f\u043e\u043b\u0435 <em>version<\/em>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e <em>INTEGER<\/em>. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e. \u042d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e \u0435\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <strong>10<\/strong>)<\/li>\n<li>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0451\u0442 \u043f\u043e\u043b\u0435 <em>signature<\/em>, \u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0435\u0441\u044f <em>SEQUENCE<\/em>-\u043e\u043c \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439: <em>algorithm<\/em> \u0438 <em>parameters<\/em>. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 <em>OBJECT IDENTIFIER<\/em> \u0438 <em>ANY<\/em> \u043f\u043e\u043b\u0435\u0439 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f <strong>15<\/strong>, <strong>26<\/strong>)<\/li>\n<li>\u041b\u0438\u0448\u044c \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 <em>signature<\/em> <em>SEQUENCE<\/em> \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430: \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435. (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <strong>13<\/strong>)<\/li>\n<li>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u0435 <em>RevokedCertificate<\/em> \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e. (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f <strong>186<\/strong>, <strong>206<\/strong>, \u0438 \u0442.\u0434.)<\/li>\n<li>\u041e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 <em>tbsCertList<\/em> \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u043f\u043e\u0447\u0442\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0432\u043e\u0434\u0430. (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <strong>5<\/strong>)<\/li>\n<li> <em>CertificateList<\/em>, \u0441\u0430\u043c\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 <em>SEQUENCE<\/em>, \u0438\u0434\u0451\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442. (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <strong>0<\/strong>)<\/li>\n<\/ul>\n<p>  \u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u0432\u0441\u0435 <em>*STRING<\/em> \u0438 \u0441\u043f\u0438\u0441\u043a\u0438 (<em>*OF<\/em>) \u043d\u0435 \u043d\u0435\u0441\u0443\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 DER, \u0437\u043d\u0430\u044f <em>.offset<\/em> \u0438 <em>.vlen<\/em> \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 (\u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438?) \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u0430\u043c \u043d\u0430\u0434\u043e, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0451\u043c\u0430 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<h2>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0438 evgen_mode_upto<\/h2>\n<p>  \u041a\u0430\u043a \u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u0437\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0447\u0442\u043e \u0437\u0430 <em>INTEGER<\/em> \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445? \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439, decode path, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f CACert.org CRL decode path \u0441\u043e\u0431\u044b\u0442\u0438\u0439:  <\/p>\n<pre> tbsCertList:version tbsCertList:signature:algorithm tbsCertList:signature:parameters tbsCertList:signature tbsCertList:issuer:rdnSequence:0:0:type                                  [...] tbsCertList:issuer:rdnSequence tbsCertList:issuer                                  [...] tbsCertList:revokedCertificates:0:userCertificate tbsCertList:revokedCertificates:0:revocationDate:utcTime tbsCertList:revokedCertificates:0:revocationDate tbsCertList:revokedCertificates:0 tbsCertList:revokedCertificates:1:userCertificate tbsCertList:revokedCertificates:1:revocationDate:utcTime tbsCertList:revokedCertificates:1:revocationDate tbsCertList:revokedCertificates:1                                  [...] tbsCertList:revokedCertificates:415755:userCertificate tbsCertList:revokedCertificates:415755:revocationDate:utcTime tbsCertList:revokedCertificates:415755:revocationDate tbsCertList:revokedCertificates:415755 tbsCertList:revokedCertificates tbsCertList signatureAlgorithm:algorithm signatureAlgorithm:parameters signatureAlgorithm signatureValue <\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0445 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e CRL:  <\/p>\n<pre> raw = file_mmaped(open(&quot;....crl&quot;, &quot;rb&quot;)) for decode_path, obj, tail in CertificateList().decode_evgen(raw):     if (len(decode_path) == 5) and (decode_path[-1] == &quot;userCertificate&quot;):         print(int(obj)) <\/pre>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <em>RevokedCertificate<\/em> \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0427\u0438\u0441\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435 \u0432 evgen-\u0440\u0435\u0436\u0438\u043c\u0435, \u043d\u043e \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 <em>revokedCertificates<\/em> \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 <em>RevokedCertificate<\/em>, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0432\u0441\u0451 \u0436\u0435 \u043d\u0435 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0441\u043a\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u00ab\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u00bb \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. PyDERASN \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 evgen-\u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f. \u0422\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0442\u044c decode path (\u043b\u044e\u0431\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 <em>(\u00abtbsCertList\u00bb, \u00abrevokedCertificates\u00bb)<\/em> \u0441\u043f\u0438\u0441\u043a\u0430) \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 <em>RevokedCertificate<\/em> \u043e\u0431\u044a\u0435\u043a\u0442:  <\/p>\n<pre> for decode_path, obj, _ in CertificateList().decode_evgen(raw, ctx={     &quot;evgen_mode_upto&quot;: (         ((&quot;tbsCertList&quot;, &quot;revokedCertificates&quot;, any), True),     ), }):     if (len(decode_path) == 3) and (decode_path[1] == &quot;revokedCertificates&quot;):         print(int(obj[&quot;userCertificate&quot;])) <\/pre>\n<h2>\u0410\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438: agg_octet_string<\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c DER-\u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 CMS \u0441 \u043a\u043e\u043f\u0438\u0435\u0439 \u0411\u0414 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0442\u043e\u0436\u0435 \u043d\u0435\u0442: \u0436\u0434\u0451\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441 decode path-\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435\/\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 CMS \u0438 \u043f\u043e offset+vlen \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 CMS \u0431\u044b\u043b \u0432 CER \u0444\u043e\u0440\u043c\u0430\u0442\u0435? \u0422\u043e\u0433\u0434\u0430 offset+vlen \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 10 GiB \u0440\u0430\u0437\u0431\u0438\u0442\u044b \u043d\u0430 \u043a\u0443\u0441\u043e\u0447\u043a\u0438 \u043f\u043e 1000 \u0431\u0430\u0439\u0442, \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u043e DER-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443. \u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 BER, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c <em>*STRING<\/em>-\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a\u043e\u0432\u0430 \u0443\u0433\u043e\u0434\u043d\u043e?  <\/p>\n<pre> SOME STRING[CONSTRUCTED]     OCTET STRING[CONSTRUCTED]         OCTET STRING[PRIMITIVE]             DATA CHUNK         OCTET STRING[PRIMITIVE]             DATA CHUNK         OCTET STRING[PRIMITIVE]             DATA CHUNK     OCTET STRING[PRIMITIVE]         DATA CHUNK     OCTET STRING[CONSTRUCTED]         OCTET STRING[PRIMITIVE]             DATA CHUNK         OCTET STRING[PRIMITIVE]             DATA CHUNK     OCTET STRING[CONSTRUCTED]         OCTET STRING[CONSTRUCTED]             OCTET STRING[PRIMITIVE]                 DATA CHUNK <\/pre>\n<p>  \u041f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 evgen-\u0440\u0435\u0436\u0438\u043c\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 (\u043d\u0435 constructed) <em>*STRING<\/em> \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0433\u0434\u0435 offset+vlen \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043a\u0443\u0441\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 PyDERASN \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f <em>agg_octet_string<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f. \u0415\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, decode path \u00ab\u043d\u0438\u0436\u0435\u00bb \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0438\u043b\u0438 <em>memoryview<\/em>) \u0438 <em>writer<\/em> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u0443\u0441\u043e\u0447\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0425\u043e\u0442\u0438\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c SHA512 \u0445\u044d\u0448 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <em>encapContentInfo.eContent<\/em> CMS-\u043a\u0438? \u041d\u0430\u0439\u0434\u0451\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <em>content<\/em> \u043f\u043e\u043b\u044f (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d <em>SignedData<\/em>), \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e CER \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u043d\u0430 \u0424\u0421 \u0438 \u0445\u044d\u0448\u0438\u0440\u0443\u044f:  <\/p>\n<pre> fdIn = open(&quot;data.p7m&quot;, &quot;rb&quot;) raw = file_mmaped(fdIn) for decode_path, obj, _ in ContentInfo().decode_evgen(raw, ctx={&quot;bered&quot;: True}):     if decode_path == (&quot;content&quot;,):         content = obj         break hasher_state = sha512() fdOut = open(&quot;dump.sql.zst&quot;, &quot;wb&quot;) def hash_n_save(data):     write_full(fdOut, data)     hasher_state.update(data)     return len(data) evgens = SignedData().decode_evgen(     raw[content.offset:],     offset=content.offset,     ctx={&quot;bered&quot;: True}, ) agg_octet_string(evgens, (&quot;encapContentInfo&quot;, &quot;eContent&quot;), raw, hash_n_save) <\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <em>write_full<\/em>, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f <em>writer<\/em> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b, \u0442\u0430\u043a \u043a\u0430\u043a, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b, \u041e\u0421 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<h2>\u041f\u0430\u0440\u0443 \u043b\u0430\u0441\u043a\u043e\u0432\u044b\u0445 \u043e SET OF<\/h2>\n<p>  \u0427\u0438\u0441\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 <em>SET OF<\/em> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u043b\u0435\u0442\u0443 \u0432 DER \u0438 CER \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0422\u0443\u0442 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0438 CER, \u043d\u0438 \u0434\u0432\u0443\u0445\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0439 DER. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 ASN.1 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u043a <em>SET<\/em> (\u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 DER), \u0442\u0430\u043a \u0438 <em>SET OF<\/em>.<\/p>\n<h2>\u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438?<\/h2>\n<p>  \u042d\u0442\u043e \u0432 PyDERASN \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 <a href=\"http:\/\/pyderasn.cypherpunks.ru\/reference.html#asn-1-browser\" rel=\"nofollow\">ASN.1 \u0431\u0440\u043e\u0443\u0437\u0435\u0440<\/a>, \u043b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u043e\u043c\u043e\u0433\u0430\u0432\u0448\u0438\u0439 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0443\u043b\u044f\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u0439 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, decode path. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043b\u044e\u0431\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u043b\u0438 CRL \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u0432 CMS.<\/p>\n<p>  <a href=\"http:\/\/www.stargrave.org\/\" rel=\"nofollow\">\u0421\u0435\u0440\u0433\u0435\u0439 \u041c\u0430\u0442\u0432\u0435\u0435\u0432<\/a>, <a href=\"http:\/\/www.cypherpunks.ru\/\" rel=\"nofollow\">\u0448\u0438\u0444\u0440\u043e\u043f\u0430\u043d\u043a<\/a>, Python\/Go-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 <a href=\"http:\/\/stcnet.ru\/\" rel=\"nofollow\">\u0424\u0413\u0423\u041f \u00ab\u041d\u0422\u0426 \u201e\u0410\u0442\u043b\u0430\u0441\u201c<\/a>.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/498014\/\"> https:\/\/habr.com\/ru\/post\/498014\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/498014\/\">\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043e <a href=\"https:\/\/habr.com\/ru\/post\/444272\/\">PyDERASN<\/a> \u2014 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c ASN.1 DER\/CER\/BER \u043a\u043e\u0434\u0435\u043a\u0435 \u043d\u0430 Python. \u0417\u0430 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0439 \u0433\u043e\u0434, \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043a\u0440\u043e\u043c\u0435 \u0432\u0441\u044f\u043a\u0438\u0445 \u043c\u0435\u043b\u043e\u0447\u0435\u0439, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439, \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0445\u043e\u0442\u044f \u0438 \u043f\u0440\u0435\u0436\u0434\u0435 \u043e\u043d \u0431\u044b\u043b \u0443\u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0441\u0442\u0440\u043e\u0433\u0438\u043c \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u0435\u043a\u043e\u0432), \u0432 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0451\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u044e\u0449\u0438\u0445 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/241\/bae\/4fc\/241bae4fcfb5d7f0c3a605bf5f3211cb.png\" alt=\"ASN.1 browser\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-302150","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=302150"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302150\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=302150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=302150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=302150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}