Хранилища сертификатов
января 30 2010 by admin in БезопасностьОсновой для управления сертификатами являются хранилища. CryptoAPI позволяет управлять разными типами хранилищ — от персональных однопользовательских до машинных и временных хранилищ, существующих только в памяти. При создании хранилища вы указываете носитель, на котором оно будет содержаться, иначе оно не будет сохранено.
Хранилища содержат сертификаты, которые, как вы знаете, применяются для аутентификации, подписи и шифрования. Однако, работая с SSL, вам вряд ли придется иметь дело с хранилищами, кроме машинных (в которых вы будете хранить сертификаты сервера) и, возможно, персональных (для хранения сертификатов клиентов). Опишу несколько сценариев.
Сценарий 1 Вы разрабатываете службу, использующую для связи SSL, которая будет работать с учетной записью LocalSystem. Пусть клиент будет аутентифицировать службу, но не наоборот. Скорей всего вы создадите для этой службы сертификат (и соответствующий ему закрытый ключ) и будете хранить его в машинном хранилище своей хост-системы. Служба распознает сертификат по его общему имени. Когда клиент подключается к службе, она с помощью CryptoAPI отыскивает свой сертификат и, используя его, инициирует сеанс связи с применением SSPI и SSL В этом случае серверу известно, что сертификат надо искать в машинном хранилище.
После аутентификации у клиента есть копия сертификата, которую он получил по сети. Хотя сам клиент не посылает сертификат, ему все же нужно расшифровать информацию из сертификата, чтобы убедиться, что он подсоединился к нужному серверу. В Windows 2000 SSL автоматически проверяет цепочку сертификатов, чтобы убедиться, что она соответствует данным, полученным от центра сертификации, которому доверяет клиент. Кроме того, имя сервера (в том виде, как его указал клиент) сравнивается с общим именем в сертификате сервера.
Однако вашему клиенту ничто не мешает с помощью функций CryptoAPI открыть сертификат, получить из него общее имя и сравнить его с известным общим именем сертификата, который он ожидал получить. Если эти имена не совпадают, клиент может предпочесть отсоединиться от сервера, так как сервер не тот, за кого себя выдает. Полезно уметь делать такую проверку, так как ранние версии Windows в отличие от Windows 2000 сами этого не делают.
В этой ситуации подразумевается наличие доверительных отношений, так как вы должны быть уверены, что центр сертификации не выдал несколько сертификатов с одним общим именем. Ваша политика в отношении разных центров сертификации может быть разной.
Общее имя представляет собой простую текстовую строку. Однако помните, что сертификаты подписаны закрытым ключом центра сертификации. Следовательно, если вы открыли сертификат открытым ключом центра, это значит, что информация в нем не менялась.
Браузеры посимвольно сравнивают общее имя из сертификата с URL, к которому подключен браузер. Если имена не совпадают, браузер считает, что защита нарушена.
Сценарий 2 Все, как в первом сценарии, но служба работает не с учетной записью LocalSystem, а со специальной доменной учетной записью, созданной для этой службы. Что касается сертификатов, то единственное существенное отличие в том, что вы (администратор сервера) будете хранить сертификат в персональном хранилище для учетной записи сервера. Дело в том, что учетная запись сервера может не быть администратором на хост-машине и, таким образом, не иметь доступа к машинному хранилищу сертификатов. Так что вам следует знать, как получать доступ к персональным учетным записям.
Сценарий 3 Этот сценарий надо рассмотреть независимо от того, с какой учетной записью будет работать ваш сервер: машинной или собственной. Если серверу нужен сертификат клиента, последний при поиске сертификата должен действовать примерно так же, как сервер.
Когда установлено соединение, клиент ищет сертификат на своей машине и использует его, чтобы установить SSL-соединение. Поскольку клиентские программы работают в основном с учетной записью интерактивного пользователя, им скорее всего не составит труда найти сертификат в персональном хранилище по его общему имени и послать его по сети. Если вы будете писать программы, реализующие один из этих сценариев,
вам нужно уметь с помощью CryptoAPI решать следующие задачи:
1. открывать хранилище сертификатов;
2. отыскивать сертификат по его общему имени;
3. расшифровывать полученный сертификат;
4. просматривать общее имя в расшифрованном сертификате и сравнивать его с известным именем.
Все эти задачи позволяет решить CryptoAPI. Хотя есть еще одна связанная с этим задача, о которой я не говорил, но выполнять которую придется — получение сертификата.