Я использую Python и OpenSSL для подключения к сайту с использованием TLS (в некоторых кросс-платформенных программах, поэтому было бы слишком много работать, чтобы переключиться на CryptoAPI для всего); Однако я не хочу распространять (и обновлять) собственный список сертификатов. Я хочу получить их с платформы. В OS X и Linux это довольно просто, но Windows поставляется с неполным списком доверенных корневых центров сертификации для TLS; в основном только собственные сертификаты Microsoft, а затем динамически добавляет доверительные корни в хранилище, когда материал TLS высокого уровня (например, загрузка веб-страницы в Internet Explorer поверх HTTPS) должен проверять корневой трафик, который он ранее не видел. (Этот процесс объясняется здесь.) Это означает, что я могу перечислить корень Windows хранилище сертификатов с wincertstore
, но это бесполезно, потому что на машинах с более поздними установленными ОС этот магазин будет почти пустым.
Microsoft предоставляет подробные инструкции для администраторов для предварительного извлечения этого списка, чтобы иметь возможность управлять машинами с жестко контролируемым доступом к сети; однако я не могу найти ссылку на API, который сделает то же самое, и просто загрузит все доверенные корневые сертификаты из Microsoft. (Честно говоря, в эпоху еженедельных обновлений для нескольких мегабайт, я не понимаю, почему предварительная загрузка этих файлов является такой большой проблемой, если это просто кеш, а для бонусных очков объясните, почему это должно произойти вообще.)
Итак: существует ли API, который позволит мне сообщить системе только предварительно кэшировать доверенные корневые сертификаты в соответствии с любыми правилами, которые он использует? В противном случае, если это действительно невозможно (т.е. Если CryptoAPI может загружать только один доверительный root за раз и только если вы подаете ему сертификат, подписанный этим корнем), есть ли способ подключить проверку сертификата OpenSSL в хранилище доверия CryptoAPI, чтобы проверка будет загружать и кэшировать доверительные корни, как и родное TLS-соединение?