Лечим ошибки SSL на старых Windows: пишем утилиту обновления корневых сертификатов на C#

Привет, Хабр!
Сегодня хочу рассказать про боль, которая, думаю, знакома многим, кто хоть раз сталкивался с поддержкой устаревших Windows-систем. А также про то, как небольшая консольная утилита на C# решила проблему, которая годами заставляла меня и моих пользователей хвататься за голову.
С чего всё началось
Всё началось с проекта BELPORTAL — набора решений для работы с государственными порталами Беларуси. Среди прочего там есть клиент для доступа к порталам, и вот с ним-то и возникла проблема.
Пользователи ставили BELPORTAL на Windows 7, Windows XP, на терминальные серверы — словом, туда, где всё ещё жил старый добрый софт. И примерно через одного получали вот такую картину:
Не удается установить защищенное соединение с сервером
или на более свежих системах:
Ошибка 0x800B0101
или классическое:
Сертификат сервера не является доверенным
При этом HTTP-сайты открывались, интернет работал, антивирус молчал. Но HTTPS — ни в какую.
Диагностика: в чём оказалась проблема
Копнув глубже, я выяснил банальную вещь: устаревшее хранилище корневых сертификатов. Windows хранит список доверенных корневых сертификатов в реестре по пути:
HKLM\SOFTWARE\Microsoft\SystemCertificates\ROOT\Certificates
Microsoft регулярно обновляет этот список через Windows Update. Проблема в том, что:
На Windows XP Windows Update для сертификатов уже давно не работает.
На Windows 7 обновления сертификатов прекратились с окончанием поддержки.
На корпоративных машинах политиками часто отключён Windows Update целиком.
На терминальных серверах обновление сертификатов — это отдельный квест.
На изолированных системах (POS-терминалы, банкоматы, медицинское оборудование) интернета нет вообще.
