{"id":501531,"date":"2026-11-03T16:28:48","date_gmt":"2026-11-03T13:28:48","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=501531"},"modified":"2026-11-03T16:28:48","modified_gmt":"2026-11-03T13:28:48","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=501531","title":{"rendered":"\u041b\u0435\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0438 SSL \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 Windows: \u043f\u0438\u0448\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043d\u0430 C#"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u0431\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0434\u0443\u043c\u0430\u044e, \u0437\u043d\u0430\u043a\u043e\u043c\u0430 \u043c\u043d\u043e\u0433\u0438\u043c, \u043a\u0442\u043e \u0445\u043e\u0442\u044c \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 Windows-\u0441\u0438\u0441\u0442\u0435\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0430 C# \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0434\u0430\u043c\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u043c\u0435\u043d\u044f \u0438 \u043c\u043e\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0445\u0432\u0430\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u0433\u043e\u043b\u043e\u0432\u0443.<\/p>\n<p>\u0421 \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c<\/p>\n<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 BELPORTAL \u2014 \u043d\u0430\u0431\u043e\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u043c\u0438 \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u0438. \u0421\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u043c, \u0438 \u0432\u043e\u0442 \u0441 \u043d\u0438\u043c-\u0442\u043e \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u043b\u0438 BELPORTAL \u043d\u0430 Windows 7, Windows XP, \u043d\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u2014 \u0441\u043b\u043e\u0432\u043e\u043c, \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0436\u0438\u043b \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 \u0441\u043e\u0444\u0442. \u0418 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<p>\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/p>\n<p>\u0438\u043b\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445:<\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 0x800B0101<\/p>\n<p>\u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435:<\/p>\n<p>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c HTTP-\u0441\u0430\u0439\u0442\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441 \u043c\u043e\u043b\u0447\u0430\u043b. \u041d\u043e HTTPS \u2014 \u043d\u0438 \u0432 \u043a\u0430\u043a\u0443\u044e.<\/p>\n<p>\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430: \u0432 \u0447\u0451\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/p>\n<p>\u041a\u043e\u043f\u043d\u0443\u0432 \u0433\u043b\u0443\u0431\u0436\u0435, \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0449\u044c: \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. Windows \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u043f\u043e \u043f\u0443\u0442\u0438:<\/p>\n<p>HKLM\\SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates<\/p>\n<p>Microsoft \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0447\u0435\u0440\u0435\u0437 Windows Update. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e:<\/p>\n<p>\u041d\u0430 Windows XP Windows Update \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<br \/>\u041d\u0430 Windows 7 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u0441 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.<br \/>\u041d\u0430 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d Windows Update \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<br \/>\u041d\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0435\u0441\u0442.<br \/>\u041d\u0430 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 (POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b, \u0431\u0430\u043d\u043a\u043e\u043c\u0430\u0442\u044b, \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435) \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u00ab\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0439\u00bb \u043d\u0430\u0431\u043e\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 2014\u20132017 \u0433\u043e\u0434\u0430. \u0410 \u0441\u0430\u0439\u0442\u044b \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0423\u0426 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>\u0427\u0442\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/p>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0434\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u044f: \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Microsoft \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440, \u043c\u0438\u043d\u0443\u044f Windows Update.<\/p>\n<p>Microsoft, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0451 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<ol>\n<li>\n<p><a href=\"http:\/\/authrootstl.cab\" rel=\"noopener nofollow\">authrootstl.cab<\/a> \u2014 CAB-\u0430\u0440\u0445\u0438\u0432 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (\u0444\u0430\u0439\u043b .stl, \u043e\u043d \u0436\u0435 CTL).<\/p>\n<\/li>\n<li>\n<p>&lt;thumbprint&gt;.crt \u2014 \u0421\u0430\u043c\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043f\u043e \u0438\u0445 SHA-1 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0447\u0435\u0442\u044b\u0440\u0451\u043c \u0448\u0430\u0433\u0430\u043c:<\/p>\n<ol>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0430\u0442\u044c <a href=\"http:\/\/authrootstl.cab\" rel=\"noopener nofollow\">authrootstl.cab<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e (\u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u0435\u0436\u0438\u0442 authroot.stl).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c CTL \u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c SHA-1 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438<\/p>\n<p>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 CTL<br \/>\u0421\u0430\u043c\u0430\u044f \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. .stl \u2014 \u044d\u0442\u043e Certificate Trust List, \u043f\u043e \u0441\u0443\u0442\u0438 ASN.1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 SEQUENCE. SHA-1 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043a\u0430\u043a OCTET STRING \u0434\u043b\u0438\u043d\u043e\u0439 20 \u0431\u0430\u0439\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 SEQUENCE.<\/p>\n<p>\u0412\u043e\u0442 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u0432\u044b\u0434\u0435\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438 \u043d\u0430\u0436\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 &lt;\/&gt; \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435):<\/p>\n<p>static List&lt;string&gt; ParseCtlThumbprints(byte[] stlData)<br \/>{<br \/>var thumbprints = new List&lt;string&gt;();<br \/>int offset = 0;<\/p>\n<p>while (offset &lt; stlData.Length &#8212; 30)<br \/>{<br \/>if (stlData[offset] != 0x30) { offset++; continue; }<\/p>\n<p>\/\/ \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 SEQUENCE (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c short \u0438 long form)<br \/>int seqLen, dataOffset;<br \/>if ((stlData[offset + 1] &amp; 0x80) != 0)<br \/>{<br \/>int lenBytes = stlData[offset + 1] &amp; 0x7F;<br \/>seqLen = 0;<br \/>for (int i = 0; i &lt; lenBytes; i++)<br \/>seqLen = (seqLen &lt;&lt; 8) | stlData[offset + 2 + i];<br \/>dataOffset = offset + 2 + lenBytes;<br \/>}<br \/>else<br \/>{<br \/>seqLen = stlData[offset + 1];<br \/>dataOffset = offset + 2;<br \/>}<\/p>\n<p>\/\/ \u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u0449\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 SEQUENCE \u0441 OCTET STRING \u0434\u043b\u0438\u043d\u043e\u0439 20 \u0431\u0430\u0439\u0442<br \/>\/\/ &#8230; (\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<p>offset = dataOffset + seqLen;<br \/>}<\/p>\n<p>return thumbprints;<br \/>}<\/p>\n<p>\u041f\u043b\u044e\u0441 \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 FindSha1Hashes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b, \u0438\u0449\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d 0x04 0x14 (OCTET STRING \u0434\u043b\u0438\u043d\u043e\u0439 20) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u0445\u0435\u0448\u0430 \u2014 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 ASN.1-\u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c .stl.<\/p>\n<p>\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430<br \/>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 130 \u0448\u0442\u0443\u043a. \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u2014 \u0434\u043e\u043b\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430 \u0447\u0430\u043d\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0430\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043f\u043e\u0440\u0446\u0438\u044e:<\/p>\n<p>int threadCount = Math.Min(ThreadCount, total);<br \/>int chunkSize = (total + threadCount &#8212; 1) \/ threadCount;<\/p>\n<p>for (int t = 0; t &lt; threadCount; t++)<br \/>{<br \/>int start = t * chunkSize;<br \/>int end = Math.Min(start + chunkSize, total);<\/p>\n<p>var thread = new Thread(() =&gt;<br \/>{<br \/>for (int i = start; i &lt; end; i++)<br \/>{<br \/>string thumb = needToDownload[i];<br \/>byte[] data = DownloadBytes(string.Format(CertCdnUrl, thumb));<br \/>lock (resultsLock)<br \/>{<br \/>results[thumb] = data;<br \/>completed++;<br \/>WriteProgress($&#187;\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: {completed}\/{total}&#187;);<br \/>}<br \/>}<br \/>});<br \/>thread.Start();<br \/>}<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e 1\u20133 \u043c\u0438\u043d\u0443\u0442 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u043b\u0430\u0431\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445.<\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440<br \/>\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Blob \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e DER-\u0431\u0430\u0439\u0442\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u042d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<br \/>DWORD dwCertEncodingType = 0x20 (X509_ASN_ENCODING)<br \/>DWORD cbCertEncoded = 1<br \/>DWORD cbCertEncoded = \u0434\u043b\u0438\u043d\u0430 DER<br \/>BYTE[] pbCertEncoded = DER-\u0431\u0430\u0439\u0442\u044b<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>static void WriteCertToRegistry(string thumbprintUpper, byte[] derBytes)<br \/>{<br \/>string keyPath = @&#187;SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates&#187; + thumbprintUpper;<\/p>\n<p>byte[] blob = new byte[12 + derBytes.Length];<br \/>Buffer.BlockCopy(BitConverter.GetBytes(0x20), 0, blob, 0, 4);<br \/>Buffer.BlockCopy(BitConverter.GetBytes(1), 0, blob, 4, 4);<br \/>Buffer.BlockCopy(BitConverter.GetBytes(derBytes.Length), 0, blob, 8, 4);<br \/>Buffer.BlockCopy(derBytes, 0, blob, 12, derBytes.Length);<\/p>\n<p>using (RegistryKey key = Registry.LocalMachine.CreateSubKey(keyPath))<br \/>{<br \/>key.SetValue(&#171;Blob&#187;, blob, RegistryValueKind.Binary);<br \/>}<br \/>}<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435<br \/>\u041e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u2014 \u044d\u0442\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438\u0437 \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0438 \u043a\u0430\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435:<\/p>\n<p>var installed = GetInstalledThumbprints();<br \/>foreach (var thumb in thumbprints)<br \/>{<br \/>if (installed.Contains(thumb.ToLower()))<br \/>alreadyInstalled++;<br \/>else<br \/>needToDownload.Add(thumb);<br \/>}<\/p>\n<p>\u041d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0433\u0434\u0435 \u0443\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u043e\u0441\u044c, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0440\u0430\u0437\u044b.<\/p>\n<p>\u0427\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/p>\n<p>\u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c GUI \u2014 \u043d\u0435\u0437\u0430\u0447\u0435\u043c. \u0412\u0441\u0451 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043d\u043e \u0441 \u0446\u0432\u0435\u0442\u043d\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c, \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u043e\u043c:<\/p>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\u2551 \u2551<br \/>\u2551 BELPORTAL \u2551<br \/>\u2551 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 v1.1 \u2551<br \/>\u2551 \u2551<br \/>\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u2500\u2500\u2500 \u0414\u041e\u0412\u0415\u0420\u0415\u041d\u041d\u042b\u0415 \u041a\u041e\u0420\u041d\u0415\u0412\u042b\u0415 \u0421\u0415\u0420\u0422\u0418\u0424\u0418\u041a\u0410\u0422\u042b \u2500\u2500\u2500<br \/>\u2139 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;<br \/>\u2714 \u0421\u043a\u0430\u0447\u0430\u043d <a href=\"http:\/\/authroot.cab\" rel=\"noopener nofollow\">authroot.cab<\/a> (45 678 \u0431\u0430\u0439\u0442)<br \/>\u2714 \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d: authroot.stl<br \/>\u2139 \u041d\u0430\u0439\u0434\u0435\u043d\u043e 128 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 Microsoft<br \/>\u2139 \u0423\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e: 12, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: 116<br \/>\u2139 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 116 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;<br \/>\u23f3 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: 116\/116<br \/>\u2714 \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e 116\/116 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<br \/>\u2139 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440&#8230;<\/p>\n<p>\u2500\u2500\u2500 \u0418\u0422\u041e\u0413\u0418 \u2500\u2500\u2500<br \/>\u2714 \u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e: 12<br \/>\u2714 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u043e\u0432\u044b\u0445: 116<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043e\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430, \u0434\u043e\u0436\u0434\u0430\u043b\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f. \u0412\u0441\u0451.<\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u0441\u0447\u0451\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/p>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u0410 \u043d\u0435 \u043f\u043e\u0434\u0441\u0443\u043d\u0435\u0442 \u043b\u0438 \u043c\u043d\u0435 \u044d\u0442\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043b\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b?\u00bb<\/p>\n<p>\u041e\u0442\u0432\u0435\u0447\u0430\u044e \u0447\u0435\u0441\u0442\u043d\u043e:<br \/>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Microsoft.<br \/>\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (CTL) \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d Microsoft, \u043d\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c CTL \u2014 \u043e\u043d\u0430 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u0443\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. \u042d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u0440\u0430\u0434\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 Windows XP, \u0433\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 CTL \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 .NET 2.0 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c.<br \/>\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0440\u0443\u0436\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0441 \u044d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u2014 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 CTL \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b.<\/p>\n<p>\u041a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e<\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0443\u0447\u0430\u0435\u0442 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445:<br \/>\u0421\u0442\u0430\u0440\u044b\u0435 Windows XP \/ 7 \/ 8 \u0431\u0435\u0437 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439.<br \/>\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u041f\u041a \u0441 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c Windows Update.<br \/>\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0438 RDS.<br \/>POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b, \u0431\u0430\u043d\u043a\u043e\u043c\u0430\u0442\u044b, \u043a\u0438\u043e\u0441\u043a\u0438.<br \/>\u041c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u043e\u0435 \u0438 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 Windows Embedded.<br \/>\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u0443\u0434\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u00ab\u043d\u0430 \u0444\u043b\u0435\u0448\u043a\u0435\u00bb.<\/p>\n<p>\u00ab\u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435?\u00bb<\/p>\n<p>\u0420\u0435\u0437\u043e\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c, \u043d\u043e:<br \/>certutil -generateSSTFromWU \u2014 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Windows 10 \/ Server 2016.<br \/>rootsupd.exe \u043e\u0442 Microsoft \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437 \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 2013 \u0433\u043e\u0434\u0430, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0442\u0430\u043c \u043c\u0430\u043b\u043e \u0438 \u043e\u043d\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435.<br \/>\u0420\u0443\u0447\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Windows Update \u2014 \u043d\u0430 XP \u0438 7 \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u0448\u0430 \u043f\u0443\u0441\u0442\u043e\u0432\u0430\u043b\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u2014 \u0437\u0430\u043d\u044f\u0442\u0430.<\/p>\n<p>\u0413\u0434\u0435 \u0432\u0437\u044f\u0442\u044c<\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u043a\u0430\u043a \u043f\u043e\u0440\u0442\u0430\u0442\u0438\u0432\u043d\u044b\u0439 EXE (~100 \u041a\u0411), \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 .NET Framework \u0432\u044b\u0448\u0435 2.0 (\u0430 \u043e\u043d \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 XP) \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430 x86, \u0442\u0430\u043a \u0438 \u043d\u0430 x64.<\/p>\n<p>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438: <a href=\"https:\/\/belportal.by\/utilita-obnovleniya-kornevyh-sertifikatov-belportal\" rel=\"noopener nofollow\">https:\/\/belportal.by\/utilita-obnovleniya-kornevyh-sertifikatov-belportal<\/a><\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b:<\/p>\n<p>using System;<br \/>using System.Collections.Generic;<br \/>using System.Diagnostics;<br \/>using <a href=\"http:\/\/System.IO\" rel=\"noopener nofollow\">System.IO<\/a>;<br \/>using <a href=\"http:\/\/System.Net\" rel=\"noopener nofollow\">System.Net<\/a>;<br \/>using System.Text;<br \/>using System.Threading;<br \/>using <a href=\"http:\/\/Microsoft.Win\" rel=\"noopener nofollow\">Microsoft.Win<\/a>32;<\/p>\n<p>namespace UpdateRootCertificates<br \/>{<br \/>class Program<br \/>{<br \/>\/\/ &#8212; \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b &#8212;<br \/>private static readonly string LogFile = Path.Combine(Environment.GetEnvironmentVariable(&#171;TEMP&#187;) ?? &#171;C:\\&#187;, &#171;UpdateRootCertificates.log&#187;);<br \/>private static readonly object LogLock = new object();<br \/>private static readonly string AuthRootCabUrl = &#171;<a href=\"http:\/\/ctldl.windowsupdate.com\/msdownload\/update\/v3\/static\/trustedr\/en\/authrootstl.cab&quot;;%EF%BF%BCprivate\" rel=\"noopener nofollow\">http:\/\/ctldl.windowsupdate.com\/msdownload\/update\/v3\/static\/trustedr\/en\/authrootstl.cab&#187;;<br \/>private<\/a> static readonly string CertCdnUrl = &#171;<a href=\"http:\/\/ctldl.windowsupdate.com\/msdownload\/update\/v3\/static\/trustedr\/en\/%7B0%7D.crt&quot;;%EF%BF%BCprivate\" rel=\"noopener nofollow\">http:\/\/ctldl.windowsupdate.com\/msdownload\/update\/v3\/static\/trustedr\/en\/{0}.crt&#187;;<br \/>private<\/a> static readonly string RootRegPath = @&#187;SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates&#187;;<br \/>private static readonly int ThreadCount = 16;<br \/>private static bool Verbose = false;<\/p>\n<p>static void Main(string[] args)<br \/>{<br \/>Console.OutputEncoding = Encoding.UTF8;<\/p>\n<p>foreach (var arg in args)<br \/>{<br \/>if (arg == &#171;-v&#187; <span class=\"habrahidden\"> arg == &#171;&#8212;verbose&#187;)<br \/>Verbose = true;<br \/>if (arg == &#171;-V&#187; <\/span> arg == &#171;&#8212;version&#187;)<br \/>{<br \/>Console.WriteLine(&#171;UpdateRootCertificates v1.1&#187;);<br \/>return;<br \/>}<br \/>}<\/p>\n<p>PrintHeader();<\/p>\n<p>try<br \/>{<br \/>Log(&#171;=== \u0421\u0422\u0410\u0420\u0422 ===&#187;);<br \/>WriteSuccess(&#171;\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f&#8230;&#187;);<\/p>\n<p>string workDir = Path.Combine(Path.GetTempPath(), &#171;UpdateRootCertificates_tmp&#187;);<br \/>if (Directory.Exists(workDir))<br \/>Directory.Delete(workDir, true);<br \/>Directory.CreateDirectory(workDir);<br \/>WriteInfo($&#187;\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u043f\u0430\u043f\u043a\u0430: {workDir}&#187;);<\/p>\n<p>try<br \/>{<br \/>ProcessAuthRoot(workDir);<br \/>}<br \/>finally<br \/>{<br \/>if (Directory.Exists(workDir))<br \/>Directory.Delete(workDir, true);<br \/>Log(&#171;\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430&#187;);<br \/>}<\/p>\n<p>Log(&#171;\u0413\u041e\u0422\u041e\u0412\u041e&#187;);<br \/>WriteSuccess(&#171;\\n\u2713 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430!&#187;);<br \/>WriteInfo(&#171;\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.&#187;);<br \/>WriteInfo(&#171;\u0424\u0430\u0439\u043b \u043b\u043e\u0433\u0430: {LogFile}&#187;); } catch (Exception ex) { Log(&#171;\u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u0410\u042f \u041e\u0428\u0418\u0411\u041a\u0410: {ex.Message}&#187;);<br \/>WriteError(&#171;\\n\u2717 \u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u0410\u042f \u041e\u0428\u0418\u0411\u041a\u0410: {ex.Message}&#187;); WriteInfo(&#171;\u0424\u0430\u0439\u043b \u043b\u043e\u0433\u0430: {LogFile}&#187;);<br \/>}<\/p>\n<p>if (Environment.UserInteractive)<br \/>{<br \/>Console.WriteLine();<br \/>WriteInfo(&#171;\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043b\u044e\u0431\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430&#8230;&#187;);<br \/>Console.ReadKey();<br \/>}<br \/>}<\/p>\n<p>static void PrintHeader()<br \/>{<br \/>Console.Clear();<br \/>string title = &#171;BELPORTAL&#187;;<br \/>string subtitle = &#171;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 v1.1&#187;;<\/p>\n<p>Console.ForegroundColor = ConsoleColor.Cyan;<br \/>Console.WriteLine(&#171;\u2554newstring(\u2032\u2550\u2032,58)\u2557&#187;);Console.WriteLine(&#171;\u2554<em>newstring<\/em>(\u2032\u2550\u2032,58)\u2557&#187;);<em>Console<\/em>.<em>WriteLine<\/em>(&#171;\u2551{new string(&#8216; &#8216;, 58)}\u2551&#187;);<\/p>\n<p>Console.ForegroundColor = ConsoleColor.Yellow;<br \/>int leftPadding = (58 &#8212; title.Length) \/ 2;<br \/>Console.WriteLine($&#187;\u2551{new string(&#8216; &#8216;, leftPadding)}{title}{new string(&#8216; &#8216;, 58 &#8212; leftPadding &#8212; title.Length)}\u2551&#187;);<\/p>\n<p>Console.ForegroundColor = ConsoleColor.White;<br \/>leftPadding = (58 &#8212; subtitle.Length) \/ 2;<br \/>Console.WriteLine($&#187;\u2551{new string(&#8216; &#8216;, leftPadding)}{subtitle}{new string(&#8216; &#8216;, 58 &#8212; leftPadding &#8212; subtitle.Length)}\u2551&#187;);<\/p>\n<p>Console.ForegroundColor = ConsoleColor.Cyan;<br \/>Console.WriteLine(\u2551\u2551&#187;\u255a{new string(&#8216;\u2550&#8217;, 58)}\u255d&#187;);<\/p>\n<p>Console.ResetColor();<br \/>Console.WriteLine();<br \/>}<\/p>\n<p>static void WriteInfo(string message)<br \/>{<br \/>Console.ForegroundColor = ConsoleColor.White;<br \/>Console.WriteLine($&#187; \u2139 {message}&#187;);<br \/>Console.ResetColor();<br \/>}<\/p>\n<p>static void WriteSuccess(string message)<br \/>{<br \/>Console.ForegroundColor = <a href=\"http:\/\/ConsoleColor.Green\" rel=\"noopener nofollow\">ConsoleColor.Green<\/a>;<br \/>Console.WriteLine($&#187; \u2714 {message}&#187;);<br \/>Console.ResetColor();<br \/>}<\/p>\n<p>static void WriteError(string message)<br \/>{<br \/>Console.ForegroundColor = <a href=\"http:\/\/ConsoleColor.Red\" rel=\"noopener nofollow\">ConsoleColor.Red<\/a>;<br \/>Console.WriteLine($&#187; \u2717 {message}&#187;);<br \/>Console.ResetColor();<br \/>}<\/p>\n<p>static void WriteWarning(string message)<br \/>{<br \/>Console.ForegroundColor = ConsoleColor.Yellow;<br \/>Console.WriteLine($&#187; \u26a0 {message}&#187;);<br \/>Console.ResetColor();<br \/>}<\/p>\n<p>static void WriteProgress(string message)<br \/>{<br \/>Console.ForegroundColor = ConsoleColor.DarkCyan;<br \/>Console.Write($&#187;\\r \u23f3 {message}&#187;);<br \/>Console.ResetColor();<br \/>}<\/p>\n<p>static void WriteSection(string message)<br \/>{<br \/>Console.ForegroundColor = ConsoleColor.Magenta;<br \/>Console.WriteLine($&#187;\\n \u2500\u2500\u2500 {message} \u2500\u2500\u2500&#187;);<br \/>Console.ResetColor();<br \/>}<\/p>\n<p>static void Log(string message)<br \/>{<br \/>lock (LogLock)<br \/>{<br \/>try { File.AppendAllText(LogFile, $&#187;{<a href=\"http:\/\/DateTime.Now\" rel=\"noopener nofollow\">DateTime.Now<\/a>:yyyy-MM-dd HH:mm:ss} &#8212; {message}{Environment.NewLine}&#187;); }<br \/>catch { }<br \/>}<br \/>}<\/p>\n<p>static void DownloadFile(string url, string destPath, int retries = 3)<br \/>{<br \/>WriteProgress($&#187;\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 {Path.GetFileName(destPath)}&#8230;&#187;);<\/p>\n<p>for (int attempt = 1; attempt &lt;= retries; attempt++)<br \/>{<br \/>try<br \/>{<br \/>using (WebClient client = new WebClient())<br \/>{<br \/>client.DownloadFile(url, destPath);<br \/>}<\/p>\n<p>if (File.Exists(destPath) &amp;&amp; new FileInfo(destPath).Length &gt; 0)<br \/>{<br \/>WriteSuccess(&#171;\u0421\u043a\u0430\u0447\u0430\u043d {Path.GetFileName(destPath)} ({new FileInfo(destPath).Length:N0} \u0431\u0430\u0439\u0442)&#187;); return; } } catch (Exception ex) { if (attempt &lt; retries) { WriteWarning(&#171;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 {attempt} \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u043f\u043e\u0432\u0442\u043e\u0440&#8230;&#187;);<br \/>Thread.Sleep(1000);<br \/>}<br \/>else<br \/>{<br \/>throw new Exception($&#187;\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u0430\u0447\u0430\u0442\u044c {url}: {ex.Message}&#187;);<br \/>}<br \/>}<br \/>}<br \/>}<\/p>\n<p>static byte[] DownloadBytes(string url)<br \/>{<br \/>try<br \/>{<br \/>HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);<br \/>request.Timeout = 30000;<br \/>request.ReadWriteTimeout = 30000;<\/p>\n<p>using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())<br \/>{<br \/>using (Stream stream = response.GetResponseStream())<br \/>{<br \/>using (MemoryStream ms = new MemoryStream())<br \/>{<br \/>byte[] buffer = new byte[4096];<br \/>int bytesRead;<br \/>while ((bytesRead = <a href=\"http:\/\/stream.Read\" rel=\"noopener nofollow\">stream.Read<\/a>(buffer, 0, buffer.Length)) &gt; 0)<br \/>{<br \/>ms.Write(buffer, 0, bytesRead);<br \/>}<br \/>return ms.ToArray();<br \/>}<br \/>}<br \/>}<br \/>}<br \/>catch<br \/>{<br \/>return null;<br \/>}<br \/>}<\/p>\n<p>static string ExtractCab(string cabPath, string destDir)<br \/>{<br \/>if (!Directory.Exists(destDir))<br \/>Directory.CreateDirectory(destDir);<\/p>\n<p>WriteProgress(&#171;\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 CAB \u0430\u0440\u0445\u0438\u0432\u0430&#8230;&#187;);<\/p>\n<p>string expandPath = Path.Combine(Environment.SystemDirectory, &#171;expand.exe&#187;);<br \/>if (!File.Exists(expandPath))<br \/>throw new Exception(&#171;expand.exe \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435&#187;);<\/p>\n<p>ProcessStartInfo psi = new ProcessStartInfo<br \/>{<br \/>FileName = expandPath,<br \/>Arguments = $&#187;&#187;{cabPath}&#187; -F:* &#171;{destDir}&#187;&#187;,<br \/>UseShellExecute = false,<br \/>CreateNoWindow = true,<br \/>RedirectStandardOutput = true,<br \/>RedirectStandardError = true<br \/>};<\/p>\n<p>using (Process process = Process.Start(psi))<br \/>{<br \/>process.WaitForExit();<br \/>if (process.ExitCode != 0)<br \/>throw new Exception($&#187;expand.exe \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441 \u043a\u043e\u0434\u043e\u043c {process.ExitCode}&#187;);<br \/>}<\/p>\n<p>string[] files = Directory.GetFiles(destDir);<br \/>if (files.Length == 0)<br \/>throw new Exception(&#171;\u0418\u0437 CAB \u0430\u0440\u0445\u0438\u0432\u0430 \u043d\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430&#187;);<\/p>\n<p>string extracted = files[0];<br \/>if (!extracted.ToLower().EndsWith(&#171;.stl&#187;))<br \/>{<br \/>string renamed = Path.ChangeExtension(extracted, &#171;.stl&#187;);<br \/>File.Move(extracted, renamed);<br \/>extracted = renamed;<br \/>}<\/p>\n<p>WriteSuccess($&#187;\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d: {Path.GetFileName(extracted)}&#187;);<br \/>return extracted;<br \/>}<\/p>\n<p>\/\/ &#8212; \u041f\u0420\u0410\u0412\u0418\u041b\u042c\u041d\u042b\u0419 \u041f\u0410\u0420\u0421\u0415\u0420 CTL (\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c STL) &#8212;<br \/>static List&lt;string&gt; ParseCtlThumbprints(byte[] stlData)<br \/>{<br \/>var thumbprints = new List&lt;string&gt;();<\/p>\n<p>try<br \/>{<br \/>int offset = 0;<br \/>while (offset &lt; stlData.Length &#8212; 30)<br \/>{<br \/>if (stlData[offset] == 0x30)<br \/>{<br \/>int seqLen;<br \/>int dataOffset;<\/p>\n<p>if ((stlData[offset + 1] &amp; 0x80) != 0)<br \/>{<br \/>int lenBytes = stlData[offset + 1] &amp; 0x7F;<br \/>if (lenBytes &gt; 0 &amp;&amp; offset + 1 + lenBytes &lt; stlData.Length)<br \/>{<br \/>seqLen = 0;<br \/>for (int i = 0; i &lt; lenBytes; i++)<br \/>{<br \/>seqLen = (seqLen &lt;&lt; 8) | stlData[offset + 2 + i];<br \/>}<br \/>dataOffset = offset + 2 + lenBytes;<br \/>}<br \/>else<br \/>{<br \/>offset++;<br \/>continue;<br \/>}<br \/>}<br \/>else<br \/>{<br \/>seqLen = stlData[offset + 1];<br \/>dataOffset = offset + 2;<br \/>}<\/p>\n<p>if (dataOffset + seqLen &gt; stlData.Length || seqLen &lt; 22)<br \/>{<br \/>offset++;<br \/>continue;<br \/>}<\/p>\n<p>int innerOffset = dataOffset;<br \/>if (innerOffset + 2 &lt; stlData.Length &amp;&amp; stlData[innerOffset] == 0x30)<br \/>{<br \/>int innerLen;<br \/>int innerDataOffset;<\/p>\n<p>if ((stlData[innerOffset + 1] &amp; 0x80) != 0)<br \/>{<br \/>int lenBytes = stlData[innerOffset + 1] &amp; 0x7F;<br \/>if (lenBytes &gt; 0 &amp;&amp; innerOffset + 1 + lenBytes &lt; stlData.Length)<br \/>{<br \/>innerLen = 0;<br \/>for (int i = 0; i &lt; lenBytes; i++)<br \/>{<br \/>innerLen = (innerLen &lt;&lt; 8) | stlData[innerOffset + 2 + i];<br \/>}<br \/>innerDataOffset = innerOffset + 2 + lenBytes;<br \/>}<br \/>else<br \/>{<br \/>offset++;<br \/>continue;<br \/>}<br \/>}<br \/>else<br \/>{<br \/>innerLen = stlData[innerOffset + 1];<br \/>innerDataOffset = innerOffset + 2;<br \/>}<\/p>\n<p>if (innerDataOffset + 22 &lt;= stlData.Length &amp;&amp;<br \/>stlData[innerDataOffset] == 0x04 &amp;&amp;<br \/>stlData[innerDataOffset + 1] == 0x14)<br \/>{<br \/>byte[] hash = new byte[20];<br \/>Array.Copy(stlData, innerDataOffset + 2, hash, 0, 20);<\/p>\n<p>bool valid = false;<br \/>foreach (byte b in hash)<br \/>{<br \/>if (b != 0 &amp;&amp; b != 0xFF)<br \/>{<br \/>valid = true;<br \/>break;<br \/>}<br \/>}<\/p>\n<p>if (valid)<br \/>{<br \/>string thumbprint = BitConverter.ToString(hash).Replace(&#171;-&#171;, &#171;&#187;).ToLower();<br \/>if (!thumbprints.Contains(thumbprint))<br \/>{<br \/>thumbprints.Add(thumbprint);<br \/>}<br \/>}<br \/>}<br \/>}<\/p>\n<p>offset = dataOffset + seqLen;<br \/>}<br \/>else<br \/>{<br \/>offset++;<br \/>}<br \/>}<\/p>\n<p>if (thumbprints.Count == 0)<br \/>{<br \/>thumbprints = FindSha1Hashes(stlData);<br \/>}<br \/>}<br \/>catch (Exception ex)<br \/>{<br \/>WriteWarning($&#187;\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 CTL: {ex.Message}&#187;);<br \/>thumbprints = FindSha1Hashes(stlData);<br \/>}<\/p>\n<p>return thumbprints;<br \/>}<\/p>\n<p>\/\/ &#8212; \u0417\u0410\u041f\u0410\u0421\u041d\u041e\u0419 \u041c\u0415\u0422\u041e\u0414: \u043f\u043e\u0438\u0441\u043a SHA-1 \u0445\u0435\u0448\u0435\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e &#8212;<br \/>static List&lt;string&gt; FindSha1Hashes(byte[] data)<br \/>{<br \/>var thumbprints = new List&lt;string&gt;();<\/p>\n<p>for (int i = 0; i &lt;= data.Length &#8212; 22; i++)<br \/>{<br \/>if (data[i] == 0x04 &amp;&amp; data[i + 1] == 0x14)<br \/>{<br \/>int hashStart = i + 2;<br \/>byte[] potentialHash = new byte[20];<br \/>Array.Copy(data, hashStart, potentialHash, 0, 20);<\/p>\n<p>int zeroCount = 0;<br \/>int ffCount = 0;<br \/>int uniqueCount = 0;<br \/>var seen = new HashSet&lt;byte&gt;();<\/p>\n<p>foreach (byte b in potentialHash)<br \/>{<br \/>if (b == 0) zeroCount++;<br \/>if (b == 0xFF) ffCount++;<br \/>if (!seen.Contains(b)) { seen.Add(b); uniqueCount++; }<br \/>}<\/p>\n<p>if (zeroCount &lt; 10 &amp;&amp; ffCount &lt; 10 &amp;&amp; uniqueCount &gt; 5)<br \/>{<br \/>string thumbprint = BitConverter.ToString(potentialHash).Replace(&#171;-&#171;, &#171;&#187;).ToLower();<br \/>if (!thumbprints.Contains(thumbprint))<br \/>{<br \/>thumbprints.Add(thumbprint);<br \/>}<br \/>}<br \/>}<br \/>}<\/p>\n<p>return thumbprints;<br \/>}<\/p>\n<p>static HashSet&lt;string&gt; GetInstalledThumbprints()<br \/>{<br \/>var installed = new HashSet&lt;string&gt;();<br \/>try<br \/>{<br \/>string regPath = @&#187;SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates&#187;;<br \/>using (RegistryKey key = Registry.LocalMachine.OpenSubKey(regPath))<br \/>{<br \/>if (key != null)<br \/>{<br \/>foreach (string subKeyName in key.GetSubKeyNames())<br \/>{<br \/>installed.Add(subKeyName.ToLower());<br \/>}<br \/>}<br \/>}<br \/>}<br \/>catch { }<br \/>return installed;<br \/>}<\/p>\n<p>static void WriteCertToRegistry(string thumbprintUpper, byte[] derBytes)<br \/>{<br \/>string keyPath = RootRegPath + &#171;\\&#187; + thumbprintUpper;<\/p>\n<p>byte[] blob = new byte[12 + derBytes.Length];<br \/>Buffer.BlockCopy(BitConverter.GetBytes(0x20), 0, blob, 0, 4);<br \/>Buffer.BlockCopy(BitConverter.GetBytes(1), 0, blob, 4, 4);<br \/>Buffer.BlockCopy(BitConverter.GetBytes(derBytes.Length), 0, blob, 8, 4);<br \/>Buffer.BlockCopy(derBytes, 0, blob, 12, derBytes.Length);<\/p>\n<p>using (RegistryKey key = Registry.LocalMachine.CreateSubKey(keyPath))<br \/>{<br \/>key.SetValue(&#171;Blob&#187;, blob, RegistryValueKind.Binary);<br \/>}<br \/>}<\/p>\n<p>static void ProcessAuthRoot(string workDir)<br \/>{<br \/>WriteSection(&#171;\u0414\u041e\u0412\u0415\u0420\u0415\u041d\u041d\u042b\u0415 \u041a\u041e\u0420\u041d\u0415\u0412\u042b\u0415 \u0421\u0415\u0420\u0422\u0418\u0424\u0418\u041a\u0410\u0422\u042b&#187;);<\/p>\n<p>string cabPath = Path.Combine(workDir, &#171;<a href=\"http:\/\/authroot.cab\" rel=\"noopener nofollow\">authroot.cab<\/a>&#171;);<br \/>string stlDir = Path.Combine(workDir, &#171;authroot&#187;);<\/p>\n<p>WriteInfo(&#171;\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;&#187;);<br \/>DownloadFile(AuthRootCabUrl, cabPath);<\/p>\n<p>string stlPath = ExtractCab(cabPath, stlDir);<\/p>\n<p>byte[] stlData = File.ReadAllBytes(stlPath);<\/p>\n<p>List&lt;string&gt; thumbprints = ParseCtlThumbprints(stlData);<\/p>\n<p>if (thumbprints.Count == 0)<br \/>{<br \/>WriteWarning(&#171;\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0444\u0430\u0439\u043b authroot.stl.&#187;);<br \/>return;<br \/>}<\/p>\n<p>WriteInfo($&#187;\u041d\u0430\u0439\u0434\u0435\u043d\u043e {thumbprints.Count} \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 Microsoft&#187;);<\/p>\n<p>WriteInfo(&#171;\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;&#187;);<br \/>var installed = GetInstalledThumbprints();<\/p>\n<p>var needToDownload = new List&lt;string&gt;();<br \/>int alreadyInstalled = 0;<\/p>\n<p>foreach (var thumb in thumbprints)<br \/>{<br \/>if (installed.Contains(thumb.ToLower()))<br \/>{<br \/>alreadyInstalled++;<br \/>if (Verbose)<br \/>WriteInfo($&#187;\u0423\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d: {thumb.ToUpper()}&#187;);<br \/>}<br \/>else<br \/>{<br \/>needToDownload.Add(thumb);<br \/>}<br \/>}<\/p>\n<p>WriteInfo($&#187;\u0423\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e: {alreadyInstalled}, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: {needToDownload.Count}&#187;);<\/p>\n<p>if (needToDownload.Count == 0)<br \/>{<br \/>WriteSuccess(&#171;\u0412\u0441\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c.&#187;);<br \/>return;<br \/>}<\/p>\n<p>int total = needToDownload.Count;<br \/>var results = new Dictionary&lt;string, byte[]&gt;();<br \/>var resultsLock = new object();<br \/>int completed = 0;<\/p>\n<p>WriteInfo($&#187;\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 {total} \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;&#187;);<\/p>\n<p>var threads = new List&lt;Thread&gt;();<br \/>int threadCount = Math.Min(ThreadCount, total);<br \/>int chunkSize = (total + threadCount &#8212; 1) \/ threadCount;<\/p>\n<p>for (int t = 0; t &lt; threadCount; t++)<br \/>{<br \/>int start = t * chunkSize;<br \/>int end = Math.Min(start + chunkSize, total);<br \/>if (start &gt;= end) break;<\/p>\n<p>var thread = new Thread(() =&gt;<br \/>{<br \/>for (int i = start; i &lt; end; i++)<br \/>{<br \/>string thumb = needToDownload[i];<br \/>byte[] data = DownloadBytes(string.Format(CertCdnUrl, thumb));<br \/>lock (resultsLock)<br \/>{<br \/>results[thumb] = data;<br \/>completed++;<br \/>WriteProgress($&#187;\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: {completed}\/{total}&#187;);<br \/>}<br \/>}<br \/>});<br \/>thread.Start();<br \/>threads.Add(thread);<br \/>}<\/p>\n<p>foreach (var thread in threads)<br \/>thread.Join();<\/p>\n<p>Console.WriteLine();<br \/>WriteSuccess($&#187;\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e {results.Count}\/{total} \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#187;);<\/p>\n<p>WriteInfo(&#171;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440&#8230;&#187;);<\/p>\n<p>int regAdded = 0;<br \/>int regFailed = 0;<\/p>\n<p>foreach (var kvp in results)<br \/>{<br \/>string thumb = kvp.Key;<br \/>byte[] der = kvp.Value;<br \/>if (der == null) { regFailed++; continue; }<\/p>\n<p>try<br \/>{<br \/>WriteCertToRegistry(thumb.ToUpper(), der);<br \/>regAdded++;<br \/>if (Verbose)<br \/>WriteSuccess(&#171;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d: {thumb.ToUpper()}&#187;); } catch (Exception ex) { WriteError(&#171;\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 {thumb.ToUpper()}: {ex.Message}&#187;);<br \/>regFailed++;<br \/>}<br \/>}<\/p>\n<p>int miss = total &#8212; results.Count;<\/p>\n<p>WriteSection(&#171;\u0418\u0422\u041e\u0413\u0418&#187;);<br \/>WriteSuccess(&#171;\u2714\u0423\u0436\u0435\u0431\u044b\u043b\u043e\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e:alreadyInstalled&#187;);WriteSuccess(&#171;\u2714\u0423\u0436\u0435\u0431\u044b\u043b\u043e\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e:<em>alreadyInstalled<\/em>&#171;);<em>WriteSuccess<\/em>(&#171;\u2714 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u043e\u0432\u044b\u0445: {regAdded}&#187;);<br \/>if (regFailed &gt; 0) WriteError(&#171;\u2717\u041e\u0448\u0438\u0431\u043e\u043a\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:regFailed&#187;);if(miss&gt;0)WriteWarning(&#171;\u2717\u041e\u0448\u0438\u0431\u043e\u043a\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:<em>regFailed<\/em>&#171;);<em>if<\/em>(<em>miss<\/em>&gt;0)<em>WriteWarning<\/em>(&#171;\u26a0 \u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435: {miss}&#187;);<br \/>}<br \/>}<br \/>}<\/p>\n<p>\u0418\u0442\u043e\u0433\u0438 \u0438 \u043f\u043b\u0430\u043d\u044b<\/p>\n<p>\u0427\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e:<br \/>\u0423\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0447\u0438\u0442 SSL-\u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 Windows.<br \/>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 XP\u201311, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438.<br \/>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 .NET \u0432\u044b\u0448\u0435 2.0.<br \/>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.<br \/>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0432 \u043f\u043b\u0430\u043d\u0430\u0445:<br \/>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 CTL (\u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043d\u043e\u0438\u043a\u043e\u0432).<br \/>\u0420\u0435\u0436\u0438\u043c \u00ab\u043e\u0444\u043b\u0430\u0439\u043d-\u043f\u0430\u043a\u0435\u0442\u00bb \u2014 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439.<br \/>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 GUI \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0431\u043e\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0434\u0440\u0443\u0433 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c HTTPS-\u0441\u0430\u0439\u0442\u044b, \u0438\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u043a \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 Windows \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435. \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0444\u0438\u0434\u0431\u0435\u043a\u0443, \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442\u0430\u043c \u0438 \u0438\u0434\u0435\u044f\u043c \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e.<\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438:<br \/>\ud83c\udf10 \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (<a href=\"https:\/\/belportal.by\/utilita-obnovleniya-kornevyh-sertifikatov-belportal)%EF%BF%BC%F0%9F%92%AC\" rel=\"noopener nofollow\">https:\/\/belportal.by\/utilita-obnovleniya-kornevyh-sertifikatov-belportal)<br \/>\ud83d\udcac<\/a> Telegram (<a href=\"https:\/\/t.me\/BelPortal\" rel=\"noopener nofollow\">https:\/\/t.me\/BelPortal<\/a>)<\/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\/1103226\/\">https:\/\/habr.com\/ru\/articles\/1103226\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u0431\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0434\u0443\u043c\u0430\u044e, \u0437\u043d\u0430\u043a\u043e\u043c\u0430 \u043c\u043d\u043e\u0433\u0438\u043c, \u043a\u0442\u043e \u0445\u043e\u0442\u044c \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 Windows-\u0441\u0438\u0441\u0442\u0435\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0430 C# \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0434\u0430\u043c\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u043c\u0435\u043d\u044f \u0438 \u043c\u043e\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0445\u0432\u0430\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u0433\u043e\u043b\u043e\u0432\u0443.\u0421 \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 BELPORTAL \u2014 \u043d\u0430\u0431\u043e\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u043c\u0438 \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u0438. \u0421\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u043c, \u0438 \u0432\u043e\u0442 \u0441 \u043d\u0438\u043c-\u0442\u043e \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u043b\u0438 BELPORTAL \u043d\u0430 Windows 7, Windows XP, \u043d\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u2014 \u0441\u043b\u043e\u0432\u043e\u043c, \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0436\u0438\u043b \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 \u0441\u043e\u0444\u0442. \u0418 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c\u0438\u043b\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445:\u041e\u0448\u0438\u0431\u043a\u0430 0x800B0101\u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435:\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u041f\u0440\u0438 \u044d\u0442\u043e\u043c HTTP-\u0441\u0430\u0439\u0442\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441 \u043c\u043e\u043b\u0447\u0430\u043b. \u041d\u043e HTTPS \u2014 \u043d\u0438 \u0432 \u043a\u0430\u043a\u0443\u044e.\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430: \u0432 \u0447\u0451\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u041a\u043e\u043f\u043d\u0443\u0432 \u0433\u043b\u0443\u0431\u0436\u0435, \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0449\u044c: \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. Windows \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u043f\u043e \u043f\u0443\u0442\u0438:HKLM\\SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\CertificatesMicrosoft \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0447\u0435\u0440\u0435\u0437 Windows Update. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e:\u041d\u0430 Windows XP Windows Update \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u041d\u0430 Windows 7 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u0441 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.\u041d\u0430 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d Windows Update \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\u041d\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0435\u0441\u0442.\u041d\u0430 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 (POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b, \u0431\u0430\u043d\u043a\u043e\u043c\u0430\u0442\u044b, \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435) \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435.\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u00ab\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0439\u00bb \u043d\u0430\u0431\u043e\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 2014\u20132017 \u0433\u043e\u0434\u0430. \u0410 \u0441\u0430\u0439\u0442\u044b \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0423\u0426 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438.\u0427\u0442\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0434\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u044f: \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Microsoft \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440, \u043c\u0438\u043d\u0443\u044f Windows Update.Microsoft, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0451 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430:authrootstl.cab \u2014 CAB-\u0430\u0440\u0445\u0438\u0432 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (\u0444\u0430\u0439\u043b .stl, \u043e\u043d \u0436\u0435 CTL).&lt;thumbprint&gt;.crt \u2014 \u0421\u0430\u043c\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043f\u043e \u0438\u0445 SHA-1 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u043c.\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0447\u0435\u0442\u044b\u0440\u0451\u043c \u0448\u0430\u0433\u0430\u043c:\u0421\u043a\u0430\u0447\u0430\u0442\u044c authrootstl.cab.\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e (\u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u0435\u0436\u0438\u0442 authroot.stl).\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c CTL \u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c SHA-1 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432.\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438\u041f\u0430\u0440\u0441\u0438\u043d\u0433 CTL\u0421\u0430\u043c\u0430\u044f \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. .stl \u2014 \u044d\u0442\u043e Certificate Trust List, \u043f\u043e \u0441\u0443\u0442\u0438 ASN.1-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 SEQUENCE. SHA-1 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043a\u0430\u043a OCTET STRING \u0434\u043b\u0438\u043d\u043e\u0439 20 \u0431\u0430\u0439\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 SEQUENCE.\u0412\u043e\u0442 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u0432\u044b\u0434\u0435\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438 \u043d\u0430\u0436\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 &lt;\/&gt; \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435):static List&lt;string&gt; ParseCtlThumbprints(byte[] stlData){var thumbprints = new List&lt;string&gt;();int offset = 0;while (offset &lt; stlData.Length &#8212; 30){if (stlData[offset] != 0x30) { offset++; continue; }\/\/ \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 SEQUENCE (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c short \u0438 long form)int seqLen, dataOffset;if ((stlData[offset + 1] &amp; 0x80) != 0){int lenBytes = stlData[offset + 1] &amp; 0x7F;seqLen = 0;for (int i = 0; i &lt; lenBytes; i++)seqLen = (seqLen &lt;&lt; 8) | stlData[offset + 2 + i];dataOffset = offset + 2 + lenBytes;}else{seqLen = stlData[offset + 1];dataOffset = offset + 2;}\/\/ \u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u0449\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 SEQUENCE \u0441 OCTET STRING \u0434\u043b\u0438\u043d\u043e\u0439 20 \u0431\u0430\u0439\u0442\/\/ &#8230; (\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438)offset = dataOffset + seqLen;}return thumbprints;}\u041f\u043b\u044e\u0441 \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 FindSha1Hashes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b, \u0438\u0449\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d 0x04 0x14 (OCTET STRING \u0434\u043b\u0438\u043d\u043e\u0439 20) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u0445\u0435\u0448\u0430 \u2014 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 ASN.1-\u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c .stl.\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 130 \u0448\u0442\u0443\u043a. \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u2014 \u0434\u043e\u043b\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430 \u0447\u0430\u043d\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0430\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043f\u043e\u0440\u0446\u0438\u044e:int threadCount = Math.Min(ThreadCount, total);int chunkSize = (total + threadCount &#8212; 1) \/ threadCount;for (int t = 0; t &lt; threadCount; t++){int start = t * chunkSize;int end = Math.Min(start + chunkSize, total);var thread = new Thread(() =&gt;{for (int i = start; i &lt; end; i++){string thumb = needToDownload[i];byte[] data = DownloadBytes(string.Format(CertCdnUrl, thumb));lock (resultsLock){results[thumb] = data;completed++;WriteProgress($&#187;\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: {completed}\/{total}&#187;);}}});thread.Start();}\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e 1\u20133 \u043c\u0438\u043d\u0443\u0442 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u043b\u0430\u0431\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445.\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Blob \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e DER-\u0431\u0430\u0439\u0442\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u042d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:DWORD dwCertEncodingType = 0x20 (X509_ASN_ENCODING)DWORD cbCertEncoded = 1DWORD cbCertEncoded = \u0434\u043b\u0438\u043d\u0430 DERBYTE[] pbCertEncoded = DER-\u0431\u0430\u0439\u0442\u044b\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:static void WriteCertToRegistry(string thumbprintUpper, byte[] derBytes){string keyPath = @&#187;SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates&#187; + thumbprintUpper;byte[] blob = new byte[12 + derBytes.Length];Buffer.BlockCopy(BitConverter.GetBytes(0x20), 0, blob, 0, 4);Buffer.BlockCopy(BitConverter.GetBytes(1), 0, blob, 4, 4);Buffer.BlockCopy(BitConverter.GetBytes(derBytes.Length), 0, blob, 8, 4);Buffer.BlockCopy(derBytes, 0, blob, 12, derBytes.Length);using (RegistryKey key = Registry.LocalMachine.CreateSubKey(keyPath)){key.SetValue(&#171;Blob&#187;, blob, RegistryValueKind.Binary);}}\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435\u041e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u2014 \u044d\u0442\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438\u0437 \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0438 \u043a\u0430\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435:var installed = GetInstalledThumbprints();foreach (var thumb in thumbprints){if (installed.Contains(thumb.ToLower()))alreadyInstalled++;elseneedToDownload.Add(thumb);}\u041d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0433\u0434\u0435 \u0443\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u043e\u0441\u044c, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0440\u0430\u0437\u044b.\u0427\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c GUI \u2014 \u043d\u0435\u0437\u0430\u0447\u0435\u043c. \u0412\u0441\u0451 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043d\u043e \u0441 \u0446\u0432\u0435\u0442\u043d\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c, \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u043e\u043c:\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\u2551 \u2551\u2551 BELPORTAL \u2551\u2551 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 v1.1 \u2551\u2551 \u2551\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u2500\u2500\u2500 \u0414\u041e\u0412\u0415\u0420\u0415\u041d\u041d\u042b\u0415 \u041a\u041e\u0420\u041d\u0415\u0412\u042b\u0415 \u0421\u0415\u0420\u0422\u0418\u0424\u0418\u041a\u0410\u0422\u042b \u2500\u2500\u2500\u2139 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;\u2714 \u0421\u043a\u0430\u0447\u0430\u043d authroot.cab (45 678 \u0431\u0430\u0439\u0442)\u2714 \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d: authroot.stl\u2139 \u041d\u0430\u0439\u0434\u0435\u043d\u043e 128 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 Microsoft\u2139 \u0423\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e: 12, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: 116\u2139 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 116 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&#8230;\u23f3 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: 116\/116\u2714 \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e 116\/116 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\u2139 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440&#8230;\u2500\u2500\u2500 \u0418\u0422\u041e\u0413\u0418 \u2500\u2500\u2500\u2714 \u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e: 12\u2714 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u043e\u0432\u044b\u0445: 116\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043e\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430, \u0434\u043e\u0436\u0434\u0430\u043b\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f. \u0412\u0441\u0451.\u0427\u0442\u043e \u043d\u0430\u0441\u0447\u0451\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u0410 \u043d\u0435 \u043f\u043e\u0434\u0441\u0443\u043d\u0435\u0442 \u043b\u0438 \u043c\u043d\u0435 \u044d\u0442\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043b\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b?\u00bb\u041e\u0442\u0432\u0435\u0447\u0430\u044e \u0447\u0435\u0441\u0442\u043d\u043e:\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Microsoft.\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (CTL) \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d Microsoft, \u043d\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c CTL \u2014 \u043e\u043d\u0430 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u0443\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. \u042d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u0440\u0430\u0434\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 Windows XP, \u0433\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 CTL \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 .NET 2.0 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c.\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0440\u0443\u0436\u0443.\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0441 \u044d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u2014 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 CTL \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b.\u041a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0443\u0447\u0430\u0435\u0442 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445:\u0421\u0442\u0430\u0440\u044b\u0435 Windows XP \/ 7 \/ 8 \u0431\u0435\u0437 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439.\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u041f\u041a \u0441 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c Windows Update.\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0438 RDS.POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b, \u0431\u0430\u043d\u043a\u043e\u043c\u0430\u0442\u044b, \u043a\u0438\u043e\u0441\u043a\u0438.\u041c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u043e\u0435 \u0438 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 Windows Embedded.\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u0443\u0434\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u00ab\u043d\u0430 \u0444\u043b\u0435\u0448\u043a\u0435\u00bb.\u00ab\u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435?\u00bb\u0420\u0435\u0437\u043e\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c, \u043d\u043e:certutil -generateSSTFromWU \u2014 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Windows 10 \/ Server 2016.rootsupd.exe \u043e\u0442 Microsoft \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437 \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 2013 \u0433\u043e\u0434\u0430, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0442\u0430\u043c \u043c\u0430\u043b\u043e \u0438 \u043e\u043d\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435.\u0420\u0443\u0447\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Windows Update \u2014 \u043d\u0430 XP \u0438 7 \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u0448\u0430 \u043f\u0443\u0441\u0442\u043e\u0432\u0430\u043b\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u2014 \u0437\u0430\u043d\u044f\u0442\u0430.\u0413\u0434\u0435 \u0432\u0437\u044f\u0442\u044c\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u043a\u0430\u043a \u043f\u043e\u0440\u0442\u0430\u0442\u0438\u0432\u043d\u044b\u0439 EXE (~100 \u041a\u0411), \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 .NET Framework \u0432\u044b\u0448\u0435 2.0 (\u0430 \u043e\u043d \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 XP) \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430 x86, \u0442\u0430\u043a \u0438 \u043d\u0430 x64.\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438: https:\/\/belportal.by\/utilita-obnovleniya-kornevyh-sertifikatov-belportal\u041f\u043e\u043b\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b:using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Net;using System.Text;using System.Threading;using Microsoft.Win32;namespace UpdateRootCertificates{class Program{\/\/ &#8212; \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b &#8212;private static readonly string LogFile = Path.Combine(Environment.GetEnvironmentVariable(&#171;TEMP&#187;) ?? &#171;C:\\&#187;, &#171;UpdateRootCertificates.log&#187;);private static readonly object LogLock = new object();private static readonly string AuthRootCabUrl = &#171;http:\/\/ctldl.windowsupdate.com\/msdownload\/update\/v3\/static\/trustedr\/en\/authrootstl.cab&#187;;private static readonly string CertCdnUrl = &#171;http:\/\/ctldl.windowsupdate.com\/msdownload\/update\/v3\/static\/trustedr\/en\/{0}.crt&#187;;private static readonly string RootRegPath = @&#187;SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates&#187;;private static readonly int ThreadCount = 16;private static bool Verbose = false;static void Main(string[] args){Console.OutputEncoding = Encoding.UTF8;foreach (var arg in args){if (arg == &#171;-v&#187;  arg == &#171;&#8212;verbose&#187;)Verbose = true;if (arg == &#171;-V&#187;  arg == &#171;&#8212;version&#187;){Console.WriteLine(&#171;UpdateRootCertificates v1.1&#187;);return;}}PrintHeader();try{Log(&#171;=== \u0421\u0422\u0410\u0420\u0422 ===&#187;);WriteSuccess(&#171;\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f&#8230;&#187;);string workDir = Path.Combine(Path.GetTempPath(), &#171;UpdateRootCertificates_tmp&#187;);if (Directory.Exists(workDir))Directory.Delete(workDir, true);Directory.CreateDirectory(workDir);WriteInfo($&#187;\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u043f\u0430\u043f\u043a\u0430: {workDir}&#187;);try{ProcessAuthRoot(workDir);}finally{if (Directory.Exists(workDir))Directory.Delete(workDir, true);Log(&#171;\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430&#187;);}Log(&#171;\u0413\u041e\u0422\u041e\u0412\u041e&#187;);WriteSuccess(&#171;\\n\u2713 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430!&#187;);WriteInfo(&#171;\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c&#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-501531","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/501531","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=501531"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/501531\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=501531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=501531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=501531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}