{"id":487829,"date":"2026-07-20T06:14:49","date_gmt":"2026-07-20T06:14:49","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=487829"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=487829","title":{"rendered":"crypto-gost \u2014 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0413\u041e\u0421\u0422 \u043d\u0430 Java \u0438 Android"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c TLS 1.3 \u043d\u0430 \u0413\u041e\u0421\u0422 \u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 CAdES, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0423\u0426, \u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c RFC \u2014 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u044f \u0432\u0430\u0441. \u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0442\u043e \u043d\u0430 JVM 21, \u0447\u0442\u043e \u043d\u0430 Android 12+ \u2014 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 API, \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432 \u043a\u043e\u0434\u0435. <\/p>\n<p><a href=\"https:\/\/gitflic.ru\/project\/red-stars-systems\/crypto-gost\" rel=\"noopener noreferrer nofollow\"><strong>crypto-gost <\/strong><\/a>\u2014 \u00a0\u00a0\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0413\u041e\u0421\u0422 \u043d\u0430 <strong>Java 21+<\/strong> \u0438 <strong>Android 12+<\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0438\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0413\u041e\u0421\u0422 \u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Java. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0440\u0435\u0434 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<blockquote>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043c, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<\/p>\n<\/blockquote>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:<\/p>\n<ul>\n<li>\n<p><strong>crypto-gost-core<\/strong> \u2014 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u044f\u0434\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0413\u041e\u0421\u0422: \u0421\u0442\u0440\u0438\u0431\u043e\u0433, \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a, \u0413\u041e\u0421\u0422 \u0420 34.10-2012,  JCA-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>crypto-gost-pkix <\/strong>\u2014 \u0413\u041e\u0421\u0422-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 PKIX: OID-\u0440\u0435\u0435\u0441\u0442\u0440, CMS SignedData\/EnvelopedData\/SignedAndEnvelopedData, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438\u0437 PKCS#7\/.p7b, X.509-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, OCSP, CRL, CSR (PKCS#10), PKCS#12, CAdES-BES\/T\/C\/X-Long Type 1, TSP, Countersignature.<\/p>\n<\/li>\n<li>\n<p><strong>crypto-gost-tls13<\/strong>  \u2014 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u00a0<strong>TLS 1.3<\/strong>\u00a0(RFC 8446) \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e\u00a0<strong>RFC 9367<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>crypto-gost-jsse<\/strong> \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f JSSE-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0434\u043b\u044f Java.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430<\/h3>\n<p>\u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u043b\u044e\u0431\u043e\u0439 \u0418\u0422-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439, \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0438\u0441\u043a\u0430\u043c\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.  \u0414\u043b\u044f \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0443\u043f\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u0435\u0442\u044c \u0438\u0445 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0438 \u0438\u043c\u0435\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.  <\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0430\u0439\u0442, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d, \u0447\u0430\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438? \u0412\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043d\u0443\u0436\u043d\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f,TLS,  \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430. \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0412 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b \u0413\u041e\u0421\u0422 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441\u0442\u0430\u043b\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0435\u0435 \u043f\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c: \u043e\u0442 \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u043d\u0430 \u0432\u044b\u0434\u0430\u0447\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043e\u043d\u044b .ru, \u0434\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u043d\u0435\u0439. <\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043f\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u0443 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0413\u041e\u0421\u0422? <\/p>\n<ul>\n<li>\n<p> <strong>Bouncycastle<\/strong> \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0440\u0438\u0441\u043a\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u0432 \u043d\u0435\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0413\u041e\u0421\u0422 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0413\u041e\u0421\u0422 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u00a0<a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2025-14813\" rel=\"noopener noreferrer nofollow\">CVE-2025-14813<\/a>\u00a0\u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f CTR. \u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0437 \u0437\u043d\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430. \u0423\u044f\u0437\u0432\u0438\u043c\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 BC-JAVA \u043e\u0442 1.59 \u0434\u043e 1.83; \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0438 RFC  \u0438\u0434\u0435\u0442 \u0441 \u044f\u0432\u043d\u044b\u043c \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>OpenSSL+gost-engine+JNI<\/strong>: \u0430\u0434 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 openssl \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0413\u041e\u0421\u0422;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043a\u0443\u043f\u043a\u0430 \u0437\u0430 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0442\u043d\u044b\u0445 <strong>\u043a\u0440\u0438\u043f\u0442\u043e-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 JCP<\/strong>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u041e\u0421 \u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Java-\u043e\u0431\u0435\u0440\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u0440\u0438\u043f\u0442\u043e-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041d\u0430 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443\u0435\u0434\u0435\u0448\u044c, \u043a\u0440\u043e\u043c\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. <\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u043e\u0442\u0437\u044b\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c, \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u043f\u043e \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u042d\u0442\u043e \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<p>\u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0413\u041e\u0421\u0422 \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0438\u0440\u0443\u044e\u0442 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p><a href=\"https:\/\/gitflic.ru\/project\/red-stars-systems\/crypto-gost\" rel=\"noopener noreferrer nofollow\"><strong>crypto-gost<\/strong><\/a> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439  \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u0430 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 &#171;\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438&#187; \u0434\u043b\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Java, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0413\u041e\u0421\u0422-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443  as-code \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0438\u0437 IDE. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u041e\u0421, \u043a\u0440\u043e\u043c\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e JVM. \u041e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. <\/p>\n<h3>\u041f\u0440\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0439, \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u043b\u0438\u0446\u043e\u043c \u0438 \u043d\u0430 \u043c\u043e\u0438 \u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0435\u0451 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. <\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f crypto-gost<\/h2>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0430\u0443\u0434\u0438\u0442\u0435 \u043a\u043e\u0434\u0430 \u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0413\u041e\u0421\u0422-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b , \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442.  Constant-time \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0433\u0438\u0433\u0438\u0435\u043d\u0430 \u0437\u0430\u0442\u0438\u0440\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 downgrade\/timing\/truncation \u0430\u0442\u0430\u043a. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0442\u0430\u0440\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e  TLS 1.3, \u0442.\u043a. \u0432 TLS 1.2 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435, \u043f\u043e\u043d\u0438\u0437\u0438\u0432 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.<\/p>\n<ul>\n<li>\n<p>fail-closed-\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0430 security-\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044f\u0445. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u2192 fatal alert + \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u043c\u00bb. <\/p>\n<\/li>\n<li>\n<p><em>No-debug \u2014 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435. <\/em>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b (private keys, traffic keys, master secrets, PSK, nonce, session IDs) \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f: \u0432 toString() \/ toDebugString() \/ \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u0445; \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><em>Stateless \u043a\u0440\u0438\u043f\u0442\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. <\/em><\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043c, \u0433\u0434\u0435 constant-time \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c \u043d\u0430 JVM \u0438\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 ADR \u0441 \u044f\u0432\u043d\u043e\u0439 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0433\u0440\u043e\u0437.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a, \u043d\u043e \u043d\u0435 \u043e\u0442 co-located, \u043a\u043e\u0433\u0434\u0430 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430 \u2014 performance, \u043d\u043e \u043d\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u043a\u043e\u0434\u0430 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 GC \u0438\u043b\u0438 \u043b\u0438\u0448\u043d\u0438\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0435\u043c \u043f\u0443\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0413\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043a <em>JDK 21 virtual threads.<\/em><\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u0412\u0441\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 API).<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0438\u0437 API. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430: \u0432 openssl \u043c\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u043c, \u043f\u0430\u0440\u0441\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0448\u0438\u0444\u0440\u0443\u0435\u043c. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0432\u044b\u043f\u0443\u0441\u043a CRL, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CMS-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, TLS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u2014 \u0432\u0441\u0451 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e API, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p> \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c (\u0438\u043d\u0442\u0435\u0440\u043e\u043f\u0435\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c) \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u043a: OpenSSL, Bouncycastle, \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0440\u0438\u043f\u0442\u043e-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430, \u0442.\u043a. \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0432\u0430\u0436\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0413\u041e\u0421\u0422-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 as code<\/h2>\n<p> \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <a href=\"https:\/\/gitflic.ru\/project\/red-stars-systems\/crypto-gost\" rel=\"noopener noreferrer nofollow\"><strong>crypto-gost<\/strong><\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c maven-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0443 \u0432\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445?  \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<\/h3>\n<pre><code class=\"java\">import org.rssys.gost.api.KeyGenerator;import org.rssys.gost.api.KeyPair;import org.rssys.gost.pkix.cert.GostCertificate;import org.rssys.gost.pkix.cert.GostCertificateBuilder;import org.rssys.gost.pkix.cert.GostDnParser;import org.rssys.gost.signature.ECParameters;ECParameters params = ECParameters.tc26a256();\/\/ 1. \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 CA \u2014 \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439, pathLen=null (\u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b)KeyPair rootKp = KeyGenerator.generateKeyPair(params);byte[] rootDn = GostDnParser.encodeDn(\"CN=My Root CA,O=MyOrg,C=RU\");GostCertificate rootCert = GostCertificateBuilder.create(params, rootDn)        .publicKey(rootKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(15)        .keyUsage(GostCertificateBuilder.KeyUsage.KEY_CERT_SIGN)        .basicConstraints(true, null)        .sign(rootKp.getPrivate());\/\/ 2. \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 CA \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043a\u043e\u0440\u043d\u0435\u043c, pathLen=0 (\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043d\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 CA)KeyPair intermediateKp = KeyGenerator.generateKeyPair(params);byte[] intermediateDn = GostDnParser.encodeDn(\"CN=My Intermediate CA,O=MyOrg,C=RU\");GostCertificate intermediateCert = GostCertificateBuilder.create(params, intermediateDn)        .publicKey(intermediateKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(5)        .basicConstraints(true, 0)        .issuerDn(rootDn)        .sign(rootKp.getPrivate());\/\/ 3. \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c CAKeyPair serverKp = KeyGenerator.generateKeyPair(params);GostCertificate serverCert = GostCertificateBuilder.create(params,                GostDnParser.encodeDn(\"CN=example.com,O=MyOrg,C=RU\"))        .publicKey(serverKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(1)        .sanDns(\"example.com\")        .keyUsage(GostCertificateBuilder.KeyUsage.DIGITAL_SIGNATURE)        .extendedKeyUsage(GostOids.EXT_SERVER_AUTH)        .issuerDn(intermediateDn)        .sign(intermediateKp.getPrivate());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><strong>basicConstraints(true, null) \u0443 \u043a\u043e\u0440\u043d\u044f vs basicConstraints(true, 0) \u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e<\/strong> \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0446\u0435\u043f\u043e\u0447\u043a\u0438: pathLen=0 \u0443 intermediate \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0435\u043c\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 CA, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 PKI \u0447\u0435\u0440\u0435\u0437 openssl \u2014 \u0437\u0430\u0431\u044b\u0442\u044c \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>issuerDn(&#8230;) \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u0438 \u044f\u0432\u043d\u043e<\/strong> \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 DN \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f, \u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c (.sign(rootKp.getPrivate())\/.sign(intermediateKp.getPrivate())) \u2014 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445, \u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>.sanDns(&#171;<\/strong>example.com<strong>&#171;)<\/strong> \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435 \u2014 \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e verifyHostname() \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<h3>\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (PEM\/DER\/PKCS12)<\/h3>\n<p>\u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u0437\u0432\u043d\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0445 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c?<\/p>\n<pre><code class=\"java\">import org.rssys.gost.pkix.cert.ChainValidator;import org.rssys.gost.pkix.cert.GostCertificate;import org.rssys.gost.pkix.cert.GostPkcs12Builder;import org.rssys.gost.pkix.cert.GostPkcs12Loader;import org.rssys.gost.pkix.cert.PkixException;import org.rssys.gost.signature.PrivateKeyParameters;import java.nio.charset.StandardCharsets;import java.util.Arrays;import java.util.List;\/\/ ============================================================\/\/ \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\/\/ ============================================================\/\/ \u041a\u043e\u0434 \u043d\u0438\u0436\u0435 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\/\/ PEM \u2194 DER: \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442String serverPem = serverCert.toPem();byte[] serverDer = serverCert.getEncoded();\/\/ \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0430\u043c\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u044d\u0442\u043e PEM \u0438\u043b\u0438 DER, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0442 \"\u0438\u0433\u0440 \u0441 \/\/ \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0435\u0439\" \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044bGostCertificate fromPem =        GostCertificate.fromPemOrDer(serverPem.getBytes(StandardCharsets.US_ASCII));GostCertificate fromDer = GostCertificate.fromDer(serverDer);\/\/ \u0411\u0430\u0439\u0442-\u0432-\u0431\u0430\u0439\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u043b\u0435 round-tripSystem.out.println(\"PEM round-trip \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d: \"        + Arrays.equals(serverCert.getEncoded(), fromPem.getEncoded()));System.out.println(\"DER round-trip \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d: \"        + Arrays.equals(serverCert.getEncoded(), fromDer.getEncoded()));\/\/PKCS#12: \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 + \u043f\u043e\u043b\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\/\u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 byte[] pfx = GostPkcs12Builder.create()        .key(serverKp.getPrivate())        .certificate(serverCert)        .caCertificate(intermediateCert)   \/\/ caCertificate() \u2014 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440,        .caCertificate(rootCert)           \/\/ \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434        .password(\"changeit\".toCharArray())        .friendlyName(\"server-cert\")        .build();GostPkcs12Loader.Result loaded =        GostPkcs12Loader.load(pfx, \"changeit\".toCharArray(), \/* allowJdkFallback *\/ false);PrivateKeyParameters loadedKey = loaded.getPrivateKey();List&lt;GostCertificate&gt; loadedChain = loaded.getCertificateChain();System.out.println(\"\u0418\u0437 PKCS12: \u043a\u043b\u044e\u0447 + \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0438\u0437 \" + loadedChain.size() + \" \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\");\/\/ ============================================================\/\/ ChainValidator \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \/\/ ============================================================\/\/ \u041f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0435\u0439\u0441: \u043f\u043e\u043b\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430, \u043a\u043e\u0440\u0435\u043d\u044c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445List&lt;GostCertificate&gt; fullChain = List.of(serverCert, intermediateCert, rootCert);ChainValidator.validateChain(fullChain, List.of(rootCert.getPublicKey()));System.out.println(\"\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u0430 \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e\");\/\/ \u041d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0435\u0439\u0441: \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d intermediate\/\/ \u0427\u0430\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 TLS-\u0441\u0435\u0440\u0432\u0435\u0440\u0430: \u043e\u0442\u0434\u0430\u043b\u0438 leaf \u0438 root,\/\/ \u0437\u0430\u0431\u044b\u043b\u0438 intermediate. \u0418\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u0436\u0434\u0451\u0448\u044c DN_MISMATCH (issuer \u0443 serverCert \u2014\/\/ DN \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e CA, \u0430 \u043d\u0435 root), \u043d\u043e \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438\/\/ \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 DN \u2014 \u0434\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f DN \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u0442.try {    ChainValidator.validateChain(            List.of(serverCert, rootCert),            List.of(rootCert.getPublicKey()));    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0439\u0442\u0438!\");} catch (PkixException e) {    System.out.println(\"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: \" + e.reason()); \/\/ SIGNATURE_INVALID}\/\/ \u041d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0435\u0439\u0441: \u043a\u043e\u0440\u0435\u043d\u044c \u043d\u0435 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445\/\/ \u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0446\u0435\u043b\u0430\u044f \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0432\u0441\u0435 \u0432\u0435\u0440\u043d\u044b, \u043d\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e\/\/ intermediate, \u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043a\u043e\u0440\u043d\u044e \u2014 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u043d\u0435 \u00ab\u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00bb\/\/ \u043f\u0440\u043e\u0448\u0430\u0433\u0430\u0442\u044c \u0432\u044b\u0448\u0435, \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a root.try {    ChainValidator.validateChain(fullChain, List.of(intermediateCert.getPublicKey()));    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0439\u0442\u0438!\");} catch (PkixException e) {    System.out.println(\"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: \" + e.reason()); \/\/ ROOT_NOT_SIGNED}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0437\u044b\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (CRL\/OCSP)<\/h3>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. \u0410 \u043a\u0430\u043a \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u043d?<\/p>\n<pre><code class=\"java\">import org.rssys.gost.pkix.cert.CrlVerifier;import org.rssys.gost.pkix.cert.GostCrlBuilder;import org.rssys.gost.pkix.cert.GostOcspResponseBuilder;import org.rssys.gost.pkix.cert.OcspVerifier;import org.rssys.gost.pkix.cert.PkixException;import org.rssys.gost.pkix.cert.ReasonCode;\/\/ \u0412\u0430\u043b\u0438\u0434\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0434\u043e\u0432\u0435\u0440\u044f\u044e\u00bb\/\/ ============================================================\/\/ CRL \u0438 OCSP \u2014 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432.\/\/ ============================================================\/\/ ChainValidator \u043e\u0442\u0432\u0435\u0442\u0438\u043b \"\u0434\u0430, \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u0430\u044f\". \u041d\u043e CA \u043c\u043e\u0433 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c\/\/ serverCert \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 (\u0443\u0442\u0435\u0447\u043a\u0430 \u043a\u043b\u044e\u0447\u0430, \u0437\u0430\u043c\u0435\u043d\u0430 \u0438 \u0442.\u0434.) \u2014\/\/ \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0439. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0437\u044b\u0432\u0430 \u2014\/\/ \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439, \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u0434\u043e\u0432\u0435\u0440\u0438\u044f.\/\/ CRL: \"\u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0439\" \u043a\u0435\u0439\u0441 \u2014 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043e\u0442\u0437\u044b\u0432\u0430byte[] emptyCrl = GostCrlBuilder.create(intermediateDn)        .thisUpdateNow()        .nextUpdateDays(7)        .withCrlNumber(1)        .sign(intermediateKp.getPrivate());\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442CrlVerifier.verify(        emptyCrl,        serverCert.getSerialNumber(),        intermediateKp.getPublic(),        serverCert.getIssuerDnBytes());System.out.println(\"CRL: \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u043d \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e\");\/\/ CRL: \u0442\u043e\u0442 \u0436\u0435 CA \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0442\u0435\u043f\u0435\u0440\u044c serverCert \u0432 \u043d\u0451\u043c \u043e\u0442\u043e\u0437\u0432\u0430\u043dbyte[] crlWithRevocation = GostCrlBuilder.create(intermediateDn)        .thisUpdateNow()        .nextUpdateDays(7)        .withCrlNumber(2)        .addRevoked(serverCert.getSerialNumber(), \"20250601000000Z\")        .sign(intermediateKp.getPrivate());\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442try {    CrlVerifier.verify(            crlWithRevocation,            serverCert.getSerialNumber(),            intermediateKp.getPublic(),            serverCert.getIssuerDnBytes());    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0439\u0442\u0438!\");} catch (PkixException e) {    System.out.println(\"CRL: \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e \u2014 \" + e.reason()); \/\/ REVOKED}\/\/ OCSP: \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u043d, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0438 \u0431\u0435\u0437 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e CRL-\u0441\u043f\u0438\u0441\u043a\u0430byte[] ocspGood = GostOcspResponseBuilder.create(serverCert.getSerialNumber())        .issuerDn(intermediateDn)        .good()        .sign(intermediateKp.getPrivate());\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442OcspVerifier.verify(ocspGood, serverCert.getSerialNumber(), intermediateCert);System.out.println(\"OCSP: \u0441\u0442\u0430\u0442\u0443\u0441 good \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e\");\/\/ OCSP: \u0442\u043e\u0442 \u0436\u0435 CA \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \"\u043e\u0442\u043e\u0437\u0432\u0430\u043d\", \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u2014 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0430byte[] ocspRevoked = GostOcspResponseBuilder.create(serverCert.getSerialNumber())        .issuerDn(intermediateDn)        .revoked(\"20250601000000Z\", ReasonCode.KEY_COMPROMISE)        .sign(intermediateKp.getPrivate());\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442try {    OcspVerifier.verify(ocspRevoked, serverCert.getSerialNumber(), intermediateCert);    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0439\u0442\u0438!\");} catch (PkixException e) {    System.out.println(\"OCSP: \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e \u2014 \" + e.reason()); \/\/ REVOKED}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><strong>CRL \u0438 OCSP \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b intermediateKp<\/strong>\u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e intermediate CA \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442. OcspVerifier.verify(&#8230;, issuerCert) \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0430\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 intermediateCert, \u0430 \u043d\u0435 \u0433\u043e\u043b\u044b\u0439 \u043a\u043b\u044e\u0447 \u2014 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0430\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 issuerNameHash\/issuerKeyHash \u0438\u0437 \u043d\u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>CrlVerifier.verify \u0438 OcspVerifier.verify \u2014 \u0435\u0434\u0438\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0438 \u0434\u043b\u044f &#171;\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u0430&#187; \u0438 &#171;\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043e\u0442\u043e\u0437\u0432\u0430\u043d&#187;.<\/strong> \u042d\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 checked-\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 PkixException \u0441 \u0440\u0430\u0437\u043d\u044b\u043c Reason (REVOKED \u043f\u0440\u043e\u0442\u0438\u0432, \u0441\u043a\u0430\u0436\u0435\u043c, SIGNATURE_INVALID \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0433\u043e CRL\/OCSP-\u043e\u0442\u0432\u0435\u0442\u0430). \u00ab\u041d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u044e\u00bb \u0432  \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0430 \u043d\u0435 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438\/\u043a\u043e\u0434\u0430\u043c\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043e\u043d\u043b\u0430\u0439\u043d \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c\u0438 \u0444\u0435\u0442\u0447\u0435\u0440\u0430\u043c\u0438, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 <a href=\"https:\/\/gitflic.ru\/project\/red-stars-systems\/crypto-gost\" rel=\"noopener noreferrer nofollow\"><strong>crypto-gost<\/strong><\/a><strong>:<\/strong><\/p>\n<pre><code class=\"java\">import org.rssys.gost.jsse.crl.JdkHttpCrlFetcher;import org.rssys.gost.jsse.ocsp.JdkHttpOcspFetcher;\/\/ URL \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430String[] cdpUris = serverCert.getCdpUris();    \/\/ CRLDistributionPointsString[] ocspUris = serverCert.getOcspUris();  \/\/ AIA: OCSP-responder'\u044b (\u0431\u0435\u0437 caIssuers)\/\/ \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u043d\u043b\u0430\u0439\u043d CRL \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c if (cdpUris != null &amp;&amp; cdpUris.length &gt; 0) {    byte[] crlDer = new JdkHttpCrlFetcher().fetch(cdpUris[0]);    CrlVerifier.verify(            crlDer,            serverCert.getSerialNumber(),            intermediateKp.getPublic(),            serverCert.getIssuerDnBytes());    System.out.println(\"CRL \u0441\u043a\u0430\u0447\u0430\u043d \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d: \" + cdpUris[0]);}\/\/ \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c OCSP-\u043e\u0442\u0432\u0435\u0442 \u043e\u043d\u043b\u0430\u0439\u043dif (ocspUris != null &amp;&amp; ocspUris.length &gt; 0) {    byte[] ocspDer = new JdkHttpOcspFetcher()            .fetch(serverCert.getEncoded(), intermediateCert.getEncoded(), ocspUris[0]);    OcspVerifier.verify(ocspDer, serverCert.getSerialNumber(), intermediateCert);    System.out.println(\"OCSP-\u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d: \" + ocspUris[0]);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<blockquote>\n<p>URI \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u044b \u0438\u0437 \u043f\u043e\u043a\u0430 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u043c\u043e\u0436\u0435\u0442 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 URI: \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 (192.168.x.x, 127.0.0.1), file:\/\/, ldap:\/\/ \u0438 \u0442.\u0434. \u2014 \u043f\u0440\u044f\u043c\u043e\u0439 SSRF-\u0432\u0435\u043a\u0442\u043e\u0440.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0444\u0435\u0442\u0447\u0438\u0442\u044c URL \u0438\u0437 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e (\u0447\u0435\u0440\u0435\u0437 HttpClient \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 JdkHttpCrlFetcher\/JdkHttpOcspFetcher), \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u043c\u0443: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 (\u0442\u043e\u043b\u044c\u043a\u043e http\/https), \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u043f\u043e\u0441\u043b\u0435 DNS-\u0440\u0435\u0437\u043e\u043b\u0432\u0430, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430. \u0428\u0442\u0430\u0442\u043d\u044b\u0435 \u0444\u0435\u0442\u0447\u0435\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (JdkHttpCrlFetcher, JdkHttpOcspFetcher) \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 SsrfGuard.isPrivateAddress(). <br \/><strong>\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0438\u0441\u043a<\/strong>: \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 HttpClient, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u043e\u0432\u043e \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442 DNS \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c \u0435\u0441\u0442\u044c \u043e\u043a\u043d\u043e \u0434\u043b\u044f DNS-rebinding.<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f CSR-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0423\u0426 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0423\u0426, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0434\u0430\u0435\u0442 TLS- \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e \u043e\u0442\u0432\u0435\u0442\u0430: <\/p>\n<pre><code class=\"java\">import org.rssys.gost.jca.spec.GostDerCodec;import org.rssys.gost.pkix.cert.GostCsrBuilder;import org.rssys.gost.pkix.cert.GostCsrParser;import org.rssys.gost.pkix.cert.GostExtensionParser;import java.util.Arrays;\/\/ ============================================================\/\/ CSR \u2014 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0423\u0426 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\/\/ ============================================================\/\/ \u0421\u0442\u043e\u0440\u043e\u043d\u0430 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044f: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447 \u0438 CSRKeyPair applicantKp = KeyGenerator.generateKeyPair(params);byte[] csrDer = GostCsrBuilder.create(                \"CN=new-service.example.com,O=MyOrg,C=RU\", applicantKp.getPublic())        .sanDns(\"new-service.example.com\", \"www.new-service.example.com\")        .keyUsage(GostCertificateBuilder.KeyUsage.DIGITAL_SIGNATURE)        .sign(applicantKp.getPrivate());System.out.println(\"CSR \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0423\u0426:\");System.out.println(GostCsrParser.fromDer(csrDer).toPem());\/\/ \u0421\u0442\u043e\u0440\u043e\u043d\u0430 \u0423\u0426: CSR \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e\/\/ \u0421\u0442\u043e\u0440\u043e\u043d\u0430 \u0423\u0426: \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c CSRGostCsrParser csr = GostCsrParser.fromDer(csrDer);\/\/ Proof-of-possession: \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c,\/\/ \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u0432 CSR \u2014 \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u0447\u0443\u0436\u043e\u0439\/\/ \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438.if (!csr.verifySelf()) {    \/\/ \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0430\u043c\u0430 \u0437\u0430\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 WARNING \u0441 subject \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c throw \u2014    \/\/ \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435    throw new IllegalArgumentException(\"CSR \u043e\u0442\u043a\u043b\u043e\u043d\u0451\u043d: proof-of-possession \u043d\u0435 \u043f\u0440\u043e\u0448\u0451\u043b\");}System.out.println(\"PoP \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d, subject=\" + csr.getSubjectDn());\/\/ \u0423\u0426 \u0440\u0435\u0448\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c (SAN \u2014 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0430),\/\/ \u0430 \u0447\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e (issuer, \u0441\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, keyUsage \u2014\/\/ \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0423\u0426)GostExtensionParser.ExtensionsResult requested = csr.getExtensions();\/\/ \u0423\u0426 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442GostCertificate issuedCert = GostCertificateBuilder.create(params, csr.getSubjectDn())        .publicKey(csr.getPublicKey())        .randomSerial()        .notBeforeNow()        .validForYears(1)        .sanDns(requested.sanDnsNames)              \/\/ \u0438\u0437 CSR        .keyUsage(GostCertificateBuilder.KeyUsage.DIGITAL_SIGNATURE) \/\/ \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0423\u0426, \u043d\u0435 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044c        .extendedKeyUsage(GostOids.EXT_SERVER_AUTH)  \/\/ \u0442\u043e\u0436\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0423\u0426, \u043d\u0435 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044c        .issuerDn(intermediateDn)        .sign(intermediateKp.getPrivate());System.out.println(\"\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u044b\u043f\u0443\u0449\u0435\u043d: \" + issuedCert.getSubjectDn());\/\/ \u041e\u0442\u0432\u0435\u0442 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044e\/\/ \u0421\u0442\u043e\u0440\u043e\u043d\u0430 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044f: \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \"\u043d\u0430\u0448\"boolean sameKey = Arrays.equals(        GostDerCodec.subjectPublicKeyPointBytes(issuedCert.getPublicKey()),        GostDerCodec.subjectPublicKeyPointBytes(applicantKp.getPublic()));if (!sameKey) {    throw new IllegalStateException(\"\u0423\u0426 \u0432\u0435\u0440\u043d\u0443\u043b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u0447\u0443\u0436\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c!\");}\/\/\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0430\u043b\u0438\u0434\u0435\u043d?ChainValidator.validateChain(        List.of(issuedCert, intermediateCert, rootCert),        List.of(rootCert.getPublicKey()));System.out.println(\"\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0430\u043b\u0438\u0434\u0435\u043d, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0448 \u043a\u043b\u044e\u0447 \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>TLS 1.3: \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442<\/h2>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043a\u0430\u043a \u043f\u043e\u0434\u043d\u044f\u0442\u044c TLS 1.3 \u0434\u043b\u044f <strong><em>Jetty 12<\/em><\/strong>, <strong><em>Tomcat 11<\/em><\/strong>, <strong><em>Undertow 2<\/em><\/strong>, <strong><em>Spring boot 3.4<\/em><\/strong>, <strong><em>Netty 4.2<\/em><\/strong>. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/gitflic.ru\/project\/red-stars-systems\/crypto-gost\/blob?file=examples\/jsse\/doc\/angie-reverse-proxy-gost-tls13.md&amp;mode=markdown&amp;branch=master\" rel=\"noopener noreferrer nofollow\">\u043a\u0430\u043a \u043f\u043e\u0434\u043d\u044f\u0442\u044c mTLS 1.3 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438: \u043a\u043b\u0438\u0435\u043d\u0442 + Angie + Java server<\/a>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 TLS 1.3 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.<\/p>\n<pre><code class=\"java\">import org.rssys.gost.api.KeyGenerator;import org.rssys.gost.api.KeyPair;import org.rssys.gost.jsse.GostSsl;import org.rssys.gost.jsse.GostSslException;import org.rssys.gost.jsse.crl.CrlPolicy;import org.rssys.gost.jsse.crl.JdkHttpCrlFetcher;import org.rssys.gost.jsse.ocsp.JdkHttpOcspFetcher;import org.rssys.gost.pkix.cert.GostCertificate;import org.rssys.gost.pkix.cert.GostCertificateBuilder;import org.rssys.gost.pkix.cert.GostPkcs12Builder;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLServerSocket;import javax.net.ssl.SSLSocket;import java.security.cert.X509Certificate;\/\/ ============================================================\/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430: \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u0434 localhost + \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 PKCS12\/\/ ============================================================\/\/ \u0414\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 SAN=localhost.\/\/ serverCert \u0438\u0437 PKI-\u0433\u043b\u0430\u0432\u044b \u0432\u044b\u043f\u0443\u0449\u0435\u043d \u043d\u0430 example.com \u2014 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u0442 \u0436\u0435\/\/ \u043a\u043b\u044e\u0447 serverKp, \u043d\u043e \u043f\u0435\u0440\u0435\u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u0434 localhost. \u0412 \u043f\u0440\u043e\u0434\u0435 \u0437\u0434\u0435\u0441\u044c\/\/ \u0431\u044b\u043b \u0431\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d, \u0430 \u043d\u0435 localhost.GostCertificate localhostCert = GostCertificateBuilder.create(params, \"CN=localhost,O=MyOrg,C=RU\")        .publicKey(serverKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(1)        .sanDns(\"localhost\")        .keyUsage(GostCertificateBuilder.KeyUsage.DIGITAL_SIGNATURE)        .issuerDn(intermediateDn)        .sign(intermediateKp.getPrivate());\/\/ .certificate(certData, keyData) (\u0433\u043e\u043b\u044b\u0439 DER) \u043d\u0435\u0441\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d\/\/ \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d  root'\u043e\u043c.\/\/ \u0423 \u043d\u0430\u0441 intermediate CA, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d PKCS12: caCertificate() \u2014\/\/ \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439\/\/ \u0441\u0435\u0440\u0432\u0435\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u0442\u0434\u0430\u0441\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f handshake.byte[] serverPfx = GostPkcs12Builder.create()        .key(serverKp.getPrivate())        .certificate(localhostCert)        .caCertificate(intermediateCert)        .caCertificate(rootCert)        .password(\"changeit\".toCharArray())        .friendlyName(\"server-cert\")        .build();\/\/ ============================================================\/\/ \u0421\u0435\u0440\u0432\u0435\u0440: PKCS12 + CA-\u0434\u043e\u0432\u0435\u0440\u0438\u0435 + \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 CRL\/\/ ============================================================SSLContext serverCtx = GostSsl.builder()        .certificate(serverPfx, \"changeit\".toCharArray())        .trustCa(rootCert.getEncoded())        .crlPolicy(CrlPolicy.IF_CDP_PRESENT) \/\/ \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0430 \u043f\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e CRL        .crlFetcher(new JdkHttpCrlFetcher())        .buildServerContext();try (SSLServerSocket serverSocket = GostSsl.serverSocket(8443, serverCtx)) {    Thread.ofVirtual().start(() -&gt; {        try (SSLSocket accepted = (SSLSocket) serverSocket.accept()) {            accepted.startHandshake();            System.out.println(\"\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e: \"                    + accepted.getSession().getCipherSuite());        } catch (Exception e) {            e.printStackTrace();        }    });    \/\/ ============================================================    \/\/ \u041a\u043b\u0438\u0435\u043d\u0442: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430    \/\/ ============================================================    SSLContext clientCtx = GostSsl.builder()            .trustCa(rootCert.getEncoded())            .buildClientContext();    try (SSLSocket socket = GostSsl.socket(\"localhost\", 8443, clientCtx)) {        System.out.println(\"Handshake \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d: \" + socket.getSession().getProtocol());    }    \/\/ ============================================================    \/\/ \u041a\u043b\u0438\u0435\u043d\u0442: \u0442\u0430 \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043d\u043e \u0441 \u044f\u0432\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u043e\u0439 OCSP\/CRL    \/\/ ============================================================    \/\/ \u0422\u043e\u0442 \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0447\u0442\u043e \u0431\u044b\u043b \u0432 PKI-\u0433\u043b\u0430\u0432\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442    \/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 handshake, \u0430 \u043d\u0435 \u043f\u043e \u0440\u0443\u0447\u043d\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432\u0443    \/\/ CrlVerifier\/OcspVerifier \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437    \/\/ \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.    SSLContext clientCtxWithRevocationCheck = GostSsl.builder()            .trustCa(rootCert.getEncoded())            .ocsp(true)                              \/\/ \u0436\u0434\u0430\u0442\u044c OCSP staple \u0432 handshake            .ocspFetcher(new JdkHttpOcspFetcher())    \/\/ fallback, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 staple \u043d\u0435 \u043f\u0440\u0438\u0441\u043b\u0430\u043b            .crlPolicy(CrlPolicy.IF_CDP_PRESENT)            .crlFetcher(new JdkHttpCrlFetcher())      \/\/ SSRF-\u0437\u0430\u0449\u0438\u0442\u0430            .buildClientContext();    try (SSLSocket socket = GostSsl.socket(\"localhost\", 8443, clientCtxWithRevocationCheck)) {        System.out.println(\"Handshake \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043e\u0442\u0437\u044b\u0432\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d: \"                + socket.getSession().getProtocol());    }    \/\/ \u0415\u0441\u043b\u0438 \u0443 \u043f\u0438\u0440\u0430 \u043e\u0442\u043e\u0437\u0432\u0430\u043d \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 handshake \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f}\/\/ ============================================================\/\/ \u0412\u0437\u0430\u0438\u043c\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f (mTLS)\/\/ ============================================================\/\/ \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 issuedCert \u0438\u0437 CSR-\u0433\u043b\u0430\u0432\u044b, \u0442\u043e\u0436\u0435 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\/\/ intermediate CA, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u0430 PKCS12 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439.byte[] clientPfx = GostPkcs12Builder.create()        .key(applicantKp.getPrivate())        .certificate(issuedCert)        .caCertificate(intermediateCert)        .caCertificate(rootCert)        .password(\"changeit\".toCharArray())        .friendlyName(\"client-cert\")        .build();\/\/ \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430SSLContext mtlsServerCtx = GostSsl.builder()        .certificate(serverPfx, \"changeit\".toCharArray())        .trustCa(rootCert.getEncoded())        .needClientAuth(true)   \/\/ \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435        .buildServerContext();\/\/ \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430SSLContext mtlsClientCtx = GostSsl.builder()        .certificate(clientPfx, \"changeit\".toCharArray())        .trustCa(rootCert.getEncoded())        .buildClientContext();\/\/ \u0421\u0435\u0440\u0432\u0435\u0440: \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439try (SSLServerSocket mtlsServerSocket = GostSsl.serverSocket(8444, mtlsServerCtx)) {    Thread.ofVirtual().start(() -&gt; {        try (SSLSocket accepted = (SSLSocket) mtlsServerSocket.accept()) {            accepted.startHandshake();            var peerCerts = accepted.getSession().getPeerCertificates();            System.out.println(\"\u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d: \"                    + ((X509Certificate) peerCerts[0]).getSubjectX500Principal());        } catch (Exception e) {            e.printStackTrace();        }    });  \/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c    try (SSLSocket socket = GostSsl.socket(\"localhost\", 8444, mtlsClientCtx)) {        System.out.println(\"mTLS handshake \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d: \" + socket.getSession().getProtocol());    }}\/\/ ============================================================\/\/ Fail-closed \u043f\u0440\u0438\u043c\u0435\u0440\u044b\/\/ ============================================================\/\/ \u041d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0435\u0439\u0441: \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0447\u0443\u0436\u043e\u043c\u0443 \u043a\u043e\u0440\u043d\u044e KeyPair otherRootKp = KeyGenerator.generateKeyPair(params);byte[] otherRootDer = GostCertificateBuilder.create(params, \"CN=Other Root,O=OtherOrg,C=RU\")        .publicKey(otherRootKp.getPublic())        .randomSerial().notBeforeNow().validForYears(1)        .basicConstraints(true, null)        .sign(otherRootKp.getPrivate())        .getEncoded();SSLContext wrongTrustCtx = GostSsl.builder().trustCa(otherRootDer).buildClientContext();try (SSLSocket socket = GostSsl.socket(\"localhost\", 8443, wrongTrustCtx)) {    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f!\");} catch (GostSslException e) {    System.out.println(\"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: \" + e.getClass().getSimpleName()            + \" (\" + e.getCause().getClass().getSimpleName() + \")\");    \/\/ GostSslException (SSLHandshakeException)}\/\/ \u041d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 2: mTLS, \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0435\u0437 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0441\u0435\u0440\u0432\u0435\u0440 \u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442SSLContext noCertClientCtx = GostSsl.builder().trustCa(rootCert.getEncoded()).buildClientContext();try (SSLSocket socket = GostSsl.socket(\"localhost\", 8444, noCertClientCtx)) {    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f!\");} catch (GostSslException e) {    System.out.println(\"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: \" + e.getClass().getSimpleName()            + \" (\" + e.getCause().getClass().getSimpleName() + \")\");}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0442\u043e \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 RFC \u0434\u043b\u044f \u0413\u041e\u0421\u0422 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.<\/p>\n<h3>\u0411\u0430\u0437\u043e\u0432\u0430\u044f CMS-\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430<\/h3>\n<p>\u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440 CMS SignedData (RFC 5652 + RFC 7091) \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u0438 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0421\u0442\u0440\u0438\u0431\u043e\u0433-256 (\u0413\u041e\u0421\u0422 \u0420 34.11-2012):<\/p>\n<pre><code class=\"java\">import org.rssys.gost.pkix.cms.CmsSignedDataBuilder;import org.rssys.gost.pkix.cms.CmsSignedDataVerifier;import org.rssys.gost.pkix.cms.VerifiedSignedData;import org.rssys.gost.pkix.cert.PkixException;import java.nio.charset.StandardCharsets;import java.util.Arrays;\/\/ ============================================================\/\/ CMS SignedData \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\/\/ ============================================================byte[] document = \"\u0414\u043e\u0433\u043e\u0432\u043e\u0440 \u211642 \u043e\u0442 01.01.2026\".getBytes(StandardCharsets.UTF_8);\/\/ --- \u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c: \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 CMS-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 ---\/\/ \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u0439 \u0436\u0435 identity, \u0447\u0442\u043e \u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 TLS-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0433\u043b\u0430\u0432\u0435 \u2014\/\/ serverKp\/localhostCert. .addCertificate(intermediateCert) \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d:\/\/ \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u0432\u0438\u0434\u0438\u0442 \u0432 CMS \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 (leaf),\/\/ \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u0442 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u043e\u0440\u0432\u0451\u0442\u0441\u044f \u043d\u0430 INCOMPLETE_CHAIN.byte[] signedEncapsulated = CmsSignedDataBuilder.create()        .data(document)        .addSigner(serverKp.getPrivate(), localhostCert)        .addCertificate(intermediateCert)        .build();VerifiedSignedData result = CmsSignedDataVerifier.verifyAny(signedEncapsulated, rootCert);System.out.println(\"\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442: \" + result.signerCertificate().getSubjectDn());System.out.println(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442: \" + Arrays.equals(document, result.data()));\/\/ --- Detached-\u043f\u043e\u0434\u043f\u0438\u0441\u044c: \u0441\u0430\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 ---\/\/ \u041d\u0443\u0436\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 CMS \u2014\/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, XML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0430 CMS \u0440\u044f\u0434\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c .sig-\u0444\u0430\u0439\u043b\u043e\u043c.byte[] signedDetached = CmsSignedDataBuilder.create()        .data(document)        .addSigner(serverKp.getPrivate(), localhostCert)        .addCertificate(intermediateCert)        .detached(true)        .build();VerifiedSignedData detachedResult = CmsSignedDataVerifier.verifyAny(signedDetached, rootCert);System.out.println(\"Detached: \u0434\u0430\u043d\u043d\u044b\u0435 \u041d\u0415 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 CMS = \" + detachedResult.data()); \/\/ null \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f\/\/ \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442byte[] brokenChain = CmsSignedDataBuilder.create()        .data(document)        .addSigner(serverKp.getPrivate(), localhostCert)        \/\/ .addCertificate(intermediateCert) \u2014 \u0437\u0430\u0431\u044b\u043b\u0438        .build();try {    CmsSignedDataVerifier.verifyAny(brokenChain, rootCert);    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0439\u0442\u0438!\");} catch (PkixException e) {    System.out.println(\"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e: \" + e.reason()); \/\/ INCOMPLETE_CHAIN}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>CMS-\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430<\/h3>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 CMS EnvelopedData (RFC 5652) \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a CTR-ACPKM (\u0413\u041e\u0421\u0422 \u0420 34.12-2015) \u0438 \u043e\u0431\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0447\u0435\u0440\u0435\u0437 VKO \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \/ KExp15 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e RFC 9189. <\/p>\n<pre><code class=\"java\">import org.rssys.gost.pkix.cms.CmsEnvelopedDataBuilder;import org.rssys.gost.pkix.cms.CmsEnvelopedDataDecryptor;import org.rssys.gost.pkix.cms.CmsKeyWrap;import org.rssys.gost.pkix.cms.Kexp15CmsKeyWrap;import org.rssys.gost.pkix.cert.PkixException;import java.nio.charset.StandardCharsets;import java.util.Arrays;\/\/ ============================================================\/\/ CMS EnvelopedData \u2014 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f\/\/ ============================================================byte[] document = \"\u0420\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u044b \u0441\u0447\u0451\u0442\u0430: ...\".getBytes(StandardCharsets.UTF_8);\/\/ CmsKeyWrap \u2014 stateless-\u043e\u0431\u044a\u0435\u043a\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0431\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430,\/\/ \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432. \u0412 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\/\/ \u0435\u0433\u043e OID (\"1.2.643.7.1.1.7.2.1\") \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\/\/ \u0441\u0432\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e \u0441\u0435\u0442\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f.CmsKeyWrap keyWrap = new Kexp15CmsKeyWrap();\/\/ --- \u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f ---\/\/ \u0412\u043d\u0443\u0442\u0440\u0438: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 CEK (\u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445),\/\/ \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0451\u043c \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a\u043e\u043c, \u0430 \u0441\u0430\u043c CEK \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f\/\/ \u0447\u0435\u0440\u0435\u0437 VKO \u0413\u041e\u0421\u0422 \u0420 34.10-2012 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u043a\u043b\u044e\u0447\u0435 issuedCert.byte[] enveloped = CmsEnvelopedDataBuilder.create()        .data(document)        .addRecipient(issuedCert) \/\/ \u043f\u0440\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f        .keyWrap(keyWrap)        .build();\/\/ --- \u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f ---byte[] decrypted = CmsEnvelopedDataDecryptor.decrypt(        enveloped, applicantKp.getPrivate(), issuedCert, keyWrap);System.out.println(\"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e \u0432\u0435\u0440\u043d\u043e: \" + Arrays.equals(document, decrypted));\/\/ --- \u0421 \u0438\u043c\u0438\u0442\u043e\u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439: \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 ---\/\/ .withOmac() \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438 (Encrypt-then-MAC) \u2014\/\/ \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043d\u0435 \u043e\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0445byte[] envelopedWithMac = CmsEnvelopedDataBuilder.create()        .data(document)        .addRecipient(issuedCert) \/\/ \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f        .keyWrap(keyWrap)        .withOmac()        .build();\/\/ \u041f\u043e\u0434\u043c\u0435\u043d\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u0434\u0430\u043d\u043d\u044b\u0445byte[] tampered = Arrays.copyOf(envelopedWithMac, envelopedWithMac.length);tampered[tampered.length \/ 2] ^= 0xFF;try {    CmsEnvelopedDataDecryptor.decrypt(tampered, applicantKp.getPrivate(), issuedCert, keyWrap);    System.out.println(\"\u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0439\u0442\u0438!\");} catch (PkixException e) {    System.out.println(\"\u041f\u043e\u0434\u043c\u0435\u043d\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430: \" + e.reason()); \/\/ MAC \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u043b \u2014 fail-closed}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 + \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438: &#171;\u0430\u0443\u0434\u0438\u0442 \u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f&#187; \u0438\u043b\u0438 &#171;\u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442&#187;. <\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u043d\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0442 \u2014 \u044d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 RFC 5652, \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u0434\u0432\u0430\u0436\u0434\u044b: \u043e\u0434\u0438\u043d ContentInfo \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 CMS (\u0413\u041e\u0421\u0422-\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u2014 RFC 4490, \u0413\u041e\u0421\u0422-\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 RFC 9189) \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u044f\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<pre><code class=\"java\">import org.rssys.gost.pkix.cms.CmsSignedAndEnvelopedData;import org.rssys.gost.pkix.cms.CmsSignedDataVerifier;import org.rssys.gost.pkix.cms.VerifiedSignedData;import java.nio.charset.StandardCharsets;import java.util.Arrays;\/\/ ============================================================\/\/ signThenEncrypt vs encryptThenSign \u2014 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u0435\u043d\u044f\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438\/\/ ============================================================byte[] contract = \"\u0423\u0441\u043b\u043e\u0432\u0438\u044f \u0441\u0434\u0435\u043b\u043a\u0438: ...\".getBytes(StandardCharsets.UTF_8);\/\/ --- sign-then-encrypt: SignedData \u0432\u043d\u0443\u0442\u0440\u0438 EnvelopedData ---\/\/ \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u043a\u0440\u044b\u0442\u0430 \u043e\u0442 \u043f\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f. \u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0432\u0448\u0438\u0439 CMS-\u0431\u043b\u043e\u0431\/\/ \u0431\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442 \u0434\u0430\u0436\u0435, \u041a\u0422\u041e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0438 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0441\u0430\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.byte[] signedThenEncrypted = CmsSignedAndEnvelopedData.signThenEncrypt(        contract, serverKp.getPrivate(), localhostCert, issuedCert);\/\/ signThenEncrypt \u043d\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 intermediateCert \u0432 SignedData \u2014\/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u044f\u0432\u043d\u043e, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 root,\/\/ \u043a\u0430\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 CA (\u043d\u0435 \u0441\u0430\u043c localhostCert \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442,\/\/ \u043d\u0435 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c).VerifiedSignedData r1 = CmsSignedAndEnvelopedData.decryptAndVerify(        signedThenEncrypted, applicantKp.getPrivate(), issuedCert,        intermediateCert, rootCert);System.out.println(\"sign-then-encrypt: \" + r1.signerCertificate().getSubjectDn());\/\/ --- encrypt-then-sign: EnvelopedData \u0432\u043d\u0443\u0442\u0440\u0438 SignedData ---\/\/ \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0432\u0438\u0434\u043d\u0430 \u0441\u043d\u0430\u0440\u0443\u0436\u0438. \u041a\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e,\/\/ \u043d\u0435 \u0438\u043c\u0435\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0430\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d.byte[] encryptedThenSigned = CmsSignedAndEnvelopedData.encryptThenSign(        contract, serverKp.getPrivate(), localhostCert, issuedCert);VerifiedSignedData r2 = CmsSignedAndEnvelopedData.verifyAndDecrypt(        encryptedThenSigned, applicantKp.getPrivate(), issuedCert,        intermediateCert, rootCert);System.out.println(\"encrypt-then-sign: \" + Arrays.equals(contract, r2.data()));\/\/ \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \"\u0430\u0443\u0434\u0438\u0442\u0430 \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0430\": \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 encrypt-then-sign \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439\/\/ SignedData, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0435\u043c \u0436\u0435 CmsSignedDataVerifier,\/\/ \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f.VerifiedSignedData outerOnly = CmsSignedDataVerifier.verifyAny(        encryptedThenSigned, intermediateCert, rootCert);System.out.println(\"\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u0441\u043d\u0430\u0440\u0443\u0436\u0438: \" + outerOnly.signerCertificate().getSubjectDn());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0414\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c BES\u2192T\u2192C\u2192X-Long<\/h3>\n<p>\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434\u044b? \u042e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b (\u0434\u043e\u0433\u043e\u0432\u043e\u0440\u044b, \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f \u043e\u0442\u0447\u0451\u0442\u043d\u043e\u0441\u0442\u044c) \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u0433\u043e\u0434\u0430\u043c\u0438 \u0438\u043b\u0438 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438, \u0430 \u0432\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 (\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, CRL-\u0441\u0435\u0440\u0432\u0435\u0440\u044b, OCSP-\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u0440\u044b, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u0438 TSA) \u2014 \u043f\u043e \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0441\u0432\u043e\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0430: <strong>BES<\/strong>\u2192<strong>T<\/strong>\u2192<strong>C<\/strong>\u2192<strong>X-Long<\/strong>.<\/p>\n<p><strong>BES (Basic Electronic Signature)<\/strong> \u2014 \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u043f\u043b\u044e\u0441 \u0432\u044b\u0437\u043e\u0432 <strong>.withCAdES()<\/strong>. <strong>BES<\/strong> \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442: <em>&#171;\u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0442\u0435\u043c, \u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u044e\u0447&#187;<\/em>. \u041d\u043e \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 &#171;<strong>\u043a\u043e\u0433\u0434\u0430&#187;<\/strong>. <\/p>\n<blockquote>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043a\u043b\u044e\u0447 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442\u0430 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u0443\u044e\u0442 (\u0443\u043a\u0440\u0430\u0434\u0443\u0442, \u0438\u043b\u0438 \u0441\u0430\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442 \u0437\u0430\u044f\u0432\u0438\u0442 <em>&#171;\u0443 \u043c\u0435\u043d\u044f \u043a\u043b\u044e\u0447 \u0443\u043a\u0440\u0430\u043b\u0438 \u043c\u0435\u0441\u044f\u0446 \u043d\u0430\u0437\u0430\u0434, \u044d\u0442\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0435 \u043c\u043e\u044f&#187;<\/em>) \u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e <strong>BES<\/strong>-\u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 <strong>\u0434\u043e<\/strong> \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435 \u0435\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439, \u0437\u0430\u0434\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c. \u042e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0441\u043b\u0430\u0431\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c.<\/p>\n<\/blockquote>\n<p><strong>T (Timestamp)<\/strong> \u2014 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 &#171;<strong>\u043a\u043e\u0433\u0434\u0430<\/strong>&#171;. \u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0442\u0440\u0435\u0442\u044c\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 (TSA \u2014 \u0441\u043b\u0443\u0436\u0431\u0430 \u0448\u0442\u0430\u043c\u043f\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0445\u044d\u0448\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044f: <em>&#171;\u044d\u0442\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0443\u0436\u0435 \u0432 \u0442\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438&#187;<\/em>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0430\u0442\u044b \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0430.<\/p>\n<blockquote>\n<p>\u041d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0438\u0441\u0442\u043e\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <strong>\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438<\/strong> \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442\u0430 \u043d\u0435 \u0431\u044b\u043b \u043e\u0442\u043e\u0437\u0432\u0430\u043d \u2014 \u043d\u0435 <em>&#171;\u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043b\u0438 \u043e\u043d \u0441\u0435\u0439\u0447\u0430\u0441&#187;<\/em>, \u0430 <em>&#171;\u0431\u044b\u043b \u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u0435\u043d \u0442\u043e\u0433\u0434\u0430&#187;<\/em>.  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u044b CRL\/OCSP-\u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430 \u0434\u0430\u0442\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0438.<\/p>\n<\/blockquote>\n<p><strong>C (Complete)<\/strong> \u2014 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 CRL\/OCSP, \u0430 <strong>\u0441\u0441\u044b\u043b\u043a\u0438<\/strong> \u043d\u0430 \u043d\u0438\u0445 (\u0445\u044d\u0448\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0443\u0436\u043d\u044b). <\/p>\n<blockquote>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0441\u044b\u043b\u043a\u0438, \u0430 \u043d\u0435 \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 CDP\/OCSP \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u0447\u0435\u0440\u0435\u0437 5-10 \u043b\u0435\u0442. \u0427\u0430\u0441\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u2014 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u044e\u0442, \u0434\u043e\u043c\u0435\u043d\u044b \u0438\u0441\u0442\u0435\u043a\u0430\u044e\u0442, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0423\u0426 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/blockquote>\n<p><strong>X-Long (Extended Long)<\/strong> \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433: \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u043e\u043a <strong>\u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong> \u2014 \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0432\u0435\u0441\u044c CRL, \u0432\u0435\u0441\u044c OCSP-\u043e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a\u0438\u043c\u0438 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430: \u0447\u0435\u0440\u0435\u0437 20 \u043b\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 TSA\/CDP\/OCSP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0435\u0433\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 CAdES-\u0431\u043b\u043e\u0431\u0430 \u2014 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0435\u0442\u044c.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u044b  \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"java\">import org.rssys.gost.pkix.cms.CAdESExtender;import org.rssys.gost.pkix.cms.CAdESSignerResult;import org.rssys.gost.pkix.cms.CmsSignedDataBuilder;import org.rssys.gost.pkix.cms.VerifiedCAdESData;import org.rssys.gost.pkix.cert.GostCrl;import org.rssys.gost.pkix.cert.GostCrlBuilder;import org.rssys.gost.pkix.cert.GostOcspResponse;import org.rssys.gost.pkix.cert.GostOcspResponseBuilder;import org.rssys.gost.pkix.tsp.JdkHttpTspTransport;import java.nio.charset.StandardCharsets;import java.nio.file.Files;import java.nio.file.Path;import java.util.Arrays;import java.util.List;\/\/ ============================================================\/\/ CAdES-BES -&gt; CAdES-T -&gt; CAdES-X Long Type 1\/\/ ============================================================\/\/ --- \u0428\u0430\u0433 1: CAdES-BES \u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c ---byte[] document = \"\u0414\u043e\u0433\u043e\u0432\u043e\u0440 \u211642, \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\"        .getBytes(StandardCharsets.UTF_8);byte[] cadesBes = CmsSignedDataBuilder.create()        .data(document)        .addSigner(serverKp.getPrivate(), localhostCert)        .withCAdES()    \/\/ signingCertificateV2 \u2014 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0443        .build();System.out.println(\"CAdES-BES: \" + cadesBes.length + \" \u0431\u0430\u0439\u0442\");\/\/ --- \u0428\u0430\u0433 2: CAdES-T \u2014 \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e TSA ---String tsaUrl = \"http:\/\/pki.tsaserver.ru\/tsp2012\/tsp.srf\";GostCertificate sertumCa = GostCertificate.fromDer(        Files.readAllBytes(Path.of(\"sertum-ca.der\")));GostCertificate guc2022 = GostCertificate.fromDer(        Files.readAllBytes(Path.of(\"guc2022.der\")));GostCertificate[] tsaTrusted = {sertumCa, guc2022};byte[] cadesT = CAdESExtender.addTimestamp(        cadesBes, tsaUrl, new JdkHttpTspTransport(), tsaTrusted);System.out.println(\"CAdES-T: \" + cadesT.length + \" \u0431\u0430\u0439\u0442 (\u0431\u044b\u043b\u043e \" + cadesBes.length + \")\");\/\/ --- \u0428\u0430\u0433 3: \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043e\u0442\u0437\u044b\u0432\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 ---\/\/ CRL \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 intermediateCert \u2014 \u0435\u0433\u043e \u043c\u043e\u0433 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0435\u043d\u044c (rootCert).\/\/ CRL \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 CA, \u0447\u0442\u043e \u0432\u044b\u0434\u0430\u043b intermediateCert, \u2014 \u043a\u043e\u0440\u043d\u0435\u043c.byte[] crlDer = GostCrlBuilder.create(rootCert.getSubjectDnBytes())        .thisUpdateNow()        .nextUpdateDays(30)        .withCrlNumber(1)        .sign(rootKp.getPrivate());GostCrl crl = new GostCrl(crlDer);\/\/ OCSP \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 localhostCert \u2014 \u0435\u0433\u043e \u043c\u043e\u0433 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c intermediate.\/\/ \u041e\u0442\u0432\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0442\u0435\u043c \u0436\u0435 CA, \u0447\u0442\u043e \u0432\u044b\u0434\u0430\u043b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u2014 intermediate.byte[] ocspDer = GostOcspResponseBuilder.create(localhostCert.getSerialNumber())        .issuerDn(intermediateCert.getSubjectDnBytes())        .good()        .sign(intermediateKp.getPrivate());GostOcspResponse ocsp = new GostOcspResponse(ocspDer);\/\/ --- \u0428\u0430\u0433 4: CAdES-X Long Type 1 \u2014 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u0441\u0451 \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e ---\/\/ \u0421\u043f\u0438\u0441\u043a\u0438 crls\/ocspList \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b chain[i]: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\/\/ \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u2014 \u0441\u0432\u043e\u0451 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043e\u0442\u0437\u044b\u0432\u0430 (\u0438\u043b\u0438 null, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e).\/\/ chain[0] = localhostCert  \u2192 ocspList[0] = OCSP \u043e\u0442 intermediate\/\/ chain[1] = intermediateCert \u2192 crls[1]    = CRL \u043e\u0442 root\/\/ chain[2] = rootCert       \u2192 \u043e\u0431\u0430 null     \u2014 trust anchor, \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044fList&lt;GostCertificate&gt; chain = Arrays.asList(localhostCert, intermediateCert, rootCert);List&lt;GostCrl&gt; crls = Arrays.asList(null, crl, null);List&lt;GostOcspResponse&gt; ocspList = Arrays.asList(ocsp, null, null);\/\/ tspUrl=null \u2014 \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0448\u0430\u0433\u0435 2, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\/\/ TSP \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. embedXLongType1 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442 addTimestamp \u043f\u0440\u0438 tspUrl==null.byte[] cadesXLong = CAdESExtender.embedXLongType1(        cadesT, chain, crls, ocspList, null, null);System.out.println(\"CAdES-X Long: \" + cadesXLong.length + \" \u0431\u0430\u0439\u0442\");\/\/ --- \u0428\u0430\u0433 5: \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u00ab\u0447\u0435\u0440\u0435\u0437 10 \u043b\u0435\u0442\u00bb ---\/\/ \u0412\u0441\u0451 \u0432\u043d\u0443\u0442\u0440\u0438: \u0446\u0435\u043f\u043e\u0447\u043a\u0430, CRL, OCSP, \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041d\u0438 CDP, \u043d\u0438 OCSP-\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u0440\/\/ \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u2014 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a \u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0423\u0426 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442.VerifiedCAdESData result = CAdESExtender.verifyCAdESXLong(        cadesXLong, rootCert, sertumCa, guc2022);System.out.println(\"\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e: \" + new String(result.data(), StandardCharsets.UTF_8));for (CAdESSignerResult sr : result.signers()) {    System.out.println(\"\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442: \" + sr.signerCertificate().getSubjectDn());    System.out.println(\"\u041c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438: \" + sr.timestamps().size());}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044f \u043d\u0435 \u0440\u0430\u0437 \u0443\u0431\u0435\u0434\u0438\u043b\u0441\u044f, \u0447\u0442\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u043d\u0435 \u0442\u0435\u0440\u043f\u0438\u0442 \u0434\u0438\u043b\u0435\u0442\u0430\u043d\u0442\u043e\u0432. \u0412 \u043d\u0435\u0439 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u043d\u044e\u0430\u043d\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0440\u044f\u0434\u043e\u0432\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443. \u041c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0430\u0443\u0434\u0438\u0442 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043b\u044e\u0434\u044c\u043c\u0438 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u043e\u0439. \u041e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043b\u0435\u0433\u043a\u043e, \u0446\u0435\u043d\u0430 \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u0430. \u0418 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c  \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u043e\u0431\u043a\u0430\u0442\u043a\u0443 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0440\u0435\u043b\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u0441\u0435\u0439\u0447\u0430\u0441? \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e \u0437\u0440\u0435\u043b\u043e\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0430 \u0442\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0447\u0442\u043e\u0431\u044b \u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0438 \u0430\u0443\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0433\u043b\u0430\u0437 \u043d\u0430 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u044f.<\/p>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u0442-\u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c DTLS 1.3.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0434, \u0442\u0435\u0441\u0442\u044b, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c \u043f\u043e\u0434\u0441\u043f\u043e\u0440\u044c\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0438\u0437\u0443\u0447\u0430\u0435\u0442 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e. \u0423\u0434\u0430\u0447\u0438 \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438!<\/p>\n<\/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\/articles\/1060744\/\">https:\/\/habr.com\/ru\/articles\/1060744\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0415\u0441\u043b\u0438 \u0432\u044b Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c TLS 1.3 \u043d\u0430 \u0413\u041e\u0421\u0422 \u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 CAdES, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0423\u0426, \u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c RFC \u2014 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u044f \u0432\u0430\u0441. \u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0442\u043e \u043d\u0430 JVM 21, \u0447\u0442\u043e \u043d\u0430 Android 12+ \u2014 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 API, \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432 \u043a\u043e\u0434\u0435. crypto-gost \u2014 \u00a0\u00a0\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0413\u041e\u0421\u0422 \u043d\u0430 Java 21+ \u0438 Android 12+, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0438\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0413\u041e\u0421\u0422 \u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Java. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0440\u0435\u0434 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\u0414\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043c, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:crypto-gost-core \u2014 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u044f\u0434\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0413\u041e\u0421\u0422: \u0421\u0442\u0440\u0438\u0431\u043e\u0433, \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a, \u0413\u041e\u0421\u0422 \u0420 34.10-2012,  JCA-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440.crypto-gost-pkix \u2014 \u0413\u041e\u0421\u0422-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 PKIX: OID-\u0440\u0435\u0435\u0441\u0442\u0440, CMS SignedData\/EnvelopedData\/SignedAndEnvelopedData, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438\u0437 PKCS#7\/.p7b, X.509-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, OCSP, CRL, CSR (PKCS#10), PKCS#12, CAdES-BES\/T\/C\/X-Long Type 1, TSP, Countersignature.crypto-gost-tls13  \u2014 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u00a0TLS 1.3\u00a0(RFC 8446) \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e\u00a0RFC 9367.crypto-gost-jsse \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f JSSE-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0434\u043b\u044f Java.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430\u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u043b\u044e\u0431\u043e\u0439 \u0418\u0422-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439, \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0438\u0441\u043a\u0430\u043c\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.  \u0414\u043b\u044f \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0443\u043f\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u0435\u0442\u044c \u0438\u0445 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0438 \u0438\u043c\u0435\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.  \u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0430\u0439\u0442, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d, \u0447\u0430\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438? \u0412\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043d\u0443\u0436\u043d\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f,TLS,  \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430. \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0412 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b \u0413\u041e\u0421\u0422 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441\u0442\u0430\u043b\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0435\u0435 \u043f\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c: \u043e\u0442 \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u043d\u0430 \u0432\u044b\u0434\u0430\u0447\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043e\u043d\u044b .ru, \u0434\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u043d\u0435\u0439. \u041a\u0430\u043a\u0438\u0435 \u043f\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u0443 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0413\u041e\u0421\u0422?  Bouncycastle \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0440\u0438\u0441\u043a\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u0432 \u043d\u0435\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0413\u041e\u0421\u0422 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0413\u041e\u0421\u0422 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u00a0CVE-2025-14813\u00a0\u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f CTR. \u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0437 \u0437\u043d\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430. \u0423\u044f\u0437\u0432\u0438\u043c\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 BC-JAVA \u043e\u0442 1.59 \u0434\u043e 1.83; \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0438 RFC  \u0438\u0434\u0435\u0442 \u0441 \u044f\u0432\u043d\u044b\u043c \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.OpenSSL+gost-engine+JNI: \u0430\u0434 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 openssl \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0413\u041e\u0421\u0422;\u041f\u043e\u043a\u0443\u043f\u043a\u0430 \u0437\u0430 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0440\u0438\u043f\u0442\u043e-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 JCP, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u041e\u0421 \u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Java-\u043e\u0431\u0435\u0440\u0442\u043a\u0438.\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u0440\u0438\u043f\u0442\u043e-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041d\u0430 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443\u0435\u0434\u0435\u0448\u044c, \u043a\u0440\u043e\u043c\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u043e\u0442\u0437\u044b\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c, \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u043f\u043e \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u042d\u0442\u043e \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.\u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0413\u041e\u0421\u0422 \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0438\u0440\u0443\u044e\u0442 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439.crypto-gost \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439  \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u0430 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 &#171;\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438&#187; \u0434\u043b\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Java, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0413\u041e\u0421\u0422-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443  as-code \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0438\u0437 IDE. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u041e\u0421, \u043a\u0440\u043e\u043c\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e JVM. \u041e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u041f\u0440\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e\u0415\u0441\u043b\u0438 \u0435\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0439, \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u043b\u0438\u0446\u043e\u043c \u0438 \u043d\u0430 \u043c\u043e\u0438 \u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0435\u0451 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f crypto-gost\u041f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0430\u0443\u0434\u0438\u0442\u0435 \u043a\u043e\u0434\u0430 \u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u0430\u043c\u0438:\u0422\u043e\u043b\u044c\u043a\u043e \u0413\u041e\u0421\u0422-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b , \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432;\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442.  Constant-time \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0433\u0438\u0433\u0438\u0435\u043d\u0430 \u0437\u0430\u0442\u0438\u0440\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 downgrade\/timing\/truncation \u0430\u0442\u0430\u043a. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0442\u0430\u0440\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e  TLS 1.3, \u0442.\u043a. \u0432 TLS 1.2 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435, \u043f\u043e\u043d\u0438\u0437\u0438\u0432 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.fail-closed-\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0430 security-\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044f\u0445. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u2192 fatal alert + \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u043c\u00bb. No-debug \u2014 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b (private keys, traffic keys, master secrets, PSK, nonce, session IDs) \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f: \u0432 toString() \/ toDebugString() \/ \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u0445; \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.Stateless \u043a\u0440\u0438\u043f\u0442\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0422\u0430\u043c, \u0433\u0434\u0435 constant-time \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c \u043d\u0430 JVM \u0438\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 ADR \u0441 \u044f\u0432\u043d\u043e\u0439 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0433\u0440\u043e\u0437.\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a, \u043d\u043e \u043d\u0435 \u043e\u0442 co-located, \u043a\u043e\u0433\u0434\u0430 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435.\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430 \u2014 performance, \u043d\u043e \u043d\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u043a\u043e\u0434\u0430 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 GC \u0438\u043b\u0438 \u043b\u0438\u0448\u043d\u0438\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0435\u043c \u043f\u0443\u0442\u0438.\u0413\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043a JDK 21 virtual threads.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u0412\u0441\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 API).\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0438\u0437 API. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430: \u0432 openssl \u043c\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u043c, \u043f\u0430\u0440\u0441\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0448\u0438\u0444\u0440\u0443\u0435\u043c. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0432\u044b\u043f\u0443\u0441\u043a CRL, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CMS-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, TLS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u2014 \u0432\u0441\u0451 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e API, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c (\u0438\u043d\u0442\u0435\u0440\u043e\u043f\u0435\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c) \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u043a: OpenSSL, Bouncycastle, \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0440\u0438\u043f\u0442\u043e-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430, \u0442.\u043a. \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0432\u0430\u0436\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0413\u041e\u0421\u0422-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 as code \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 crypto-gost \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c maven-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0443 \u0432\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445?  \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432import org.rssys.gost.api.KeyGenerator;import org.rssys.gost.api.KeyPair;import org.rssys.gost.pkix.cert.GostCertificate;import org.rssys.gost.pkix.cert.GostCertificateBuilder;import org.rssys.gost.pkix.cert.GostDnParser;import org.rssys.gost.signature.ECParameters;ECParameters params = ECParameters.tc26a256();\/\/ 1. \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 CA \u2014 \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439, pathLen=null (\u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b)KeyPair rootKp = KeyGenerator.generateKeyPair(params);byte[] rootDn = GostDnParser.encodeDn(&#171;CN=My Root CA,O=MyOrg,C=RU&#187;);GostCertificate rootCert = GostCertificateBuilder.create(params, rootDn)        .publicKey(rootKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(15)        .keyUsage(GostCertificateBuilder.KeyUsage.KEY_CERT_SIGN)        .basicConstraints(true, null)        .sign(rootKp.getPrivate());\/\/ 2. \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 CA \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043a\u043e\u0440\u043d\u0435\u043c, pathLen=0 (\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043d\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 CA)KeyPair intermediateKp = KeyGenerator.generateKeyPair(params);byte[] intermediateDn = GostDnParser.encodeDn(&#171;CN=My Intermediate CA,O=MyOrg,C=RU&#187;);GostCertificate intermediateCert = GostCertificateBuilder.create(params, intermediateDn)        .publicKey(intermediateKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(5)        .basicConstraints(true, 0)        .issuerDn(rootDn)        .sign(rootKp.getPrivate());\/\/ 3. \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c CAKeyPair serverKp = KeyGenerator.generateKeyPair(params);GostCertificate serverCert = GostCertificateBuilder.create(params,                GostDnParser.encodeDn(&#171;CN=example.com,O=MyOrg,C=RU&#187;))        .publicKey(serverKp.getPublic())        .randomSerial()        .notBeforeNow()        .validForYears(1)        .sanDns(&#171;example.com&#187;)        .keyUsage(GostCertificateBuilder.KeyUsage.DIGITAL_SIGNATURE)        .extendedKeyUsage(GostOids.EXT_SERVER_AUTH)        .issuerDn(intermediateDn)        .sign(intermediateKp.getPrivate());basicConstraints(true, null) \u0443 \u043a\u043e\u0440\u043d\u044f vs basicConstraints(true, 0) \u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0446\u0435\u043f\u043e\u0447\u043a\u0438: pathLen=0 \u0443 intermediate \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0435\u043c\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 CA, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 PKI \u0447\u0435\u0440\u0435\u0437 openssl \u2014 \u0437\u0430\u0431\u044b\u0442\u044c \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.issuerDn(&#8230;) \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u0438 \u044f\u0432\u043d\u043e \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 DN \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f, \u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c (.sign(rootKp.getPrivate())\/.sign(intermediateKp.getPrivate())) \u2014 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445, \u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430..sanDns(&#171;example.com&#187;) \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435 \u2014 \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e verifyHostname() \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (PEM\/DER\/PKCS12)\u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u0437\u0432\u043d\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0445 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c?import&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-487829","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487829","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=487829"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487829\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=487829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=487829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=487829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}