CAC Smartcard Повторная аутентификация - PullRequest
9 голосов
/ 26 ноября 2009

У нас есть одно браузерное приложение, в котором мы хотим, чтобы пользователь повторно аутентифицировался при входе в него. Поэтому, когда они получают доступ к этому URL-адресу, мы хотим, чтобы они были представлены с подсказкой PIN-кода, чтобы они могли повторно пройти аутентификацию. Есть ли разумный способ сделать это?

Дополнительная информация: это для карты CAC, и на рабочих станциях есть ActivIdentity и Tumbleweed. Кроме того, я мог бы добавить сервис на рабочие станции при необходимости. Все браузеры IE7. Веб-сервер IIS 6, а страницы написаны на ASP.NET (в основном).

Ответы [ 3 ]

11 голосов
/ 26 ноября 2009

Здесь задействовано несколько разных программ.

Сначала сама карта. Для выполнения цифровой подписи CAC должен быть в «проверенном» состоянии, что означает, что PIN-код был введен после того, как карта была вставлена. Кроме того, у каждого ключа на карте есть флаг, который указывает на необходимость ввода PIN-кода при каждом использовании ключа. Я не проверял, но я думаю, что это установлено для пары ключей «электронная почта» на CAC. Таким образом, вам необходимо найти, для каких ключей установлен этот флаг «всегда проверять», и настроить средство проверки пути в службе для приема только этих ключей. Возможно, вам потребуется конкретный OID при использовании расширенного ключа или исключить некоторые промежуточные сертификаты DoD из построения пути (возможно, пометив их как отозванные).

Промежуточное программное обеспечение на машине, взаимодействующей с картой, также может кэшировать ПИН-код и предоставлять его на карту всякий раз, когда карта указывает, что ей требуется ПИН-код до того, как она завершит операцию. Я думаю, что ActivClient делал это с помощью функции кэширования PIN-кода до версии 6, но в версии 7 эта опция, похоже, пропала. Я не нашел ничего подобного во встроенной поддержке Windows PIV. Эта «функция» может поставить под угрозу безопасность, поэтому я предполагаю, что она была намеренно удалена, и не было никаких взломов реестра или каких-либо других действий, которые могли бы восстановить поведение. Это то, что вы не можете контролировать, если не управляете машинами пользователей; нет заголовка HTTP или опции TLS, которую можно использовать для принудительного ввода PIN-кода. Но с более новыми системами это не должно быть проблемой.

На стороне сервера должно произойти полное рукопожатие, чтобы клиент выполнил аутентификацию. Аутентификация клиента не произойдет, если будет действительный сеанс TLS. Поэтому вам нужно найти способ сделать недействительным сеанс TLS (а не сеанс приложения, который, вероятно, связан с HTTP-файлом cookie) перед запросом аутентификации, или перенаправить запрос аутентификации на другой интерфейс, для которого сеансы не включены.

7 голосов
/ 26 ноября 2009

Существует два способа аутентификации клиента с помощью смарт-карты в Интернете: стандартный TLS / SSL или пользовательские плагины для браузера. Я предполагаю, что вы говорите о стандартных веб-браузерах (IE / FF / Safari) и аутентификации SSL.

Для подсказок с ПИН-кодом важны две вещи:

  • Сеанс SSL и кеш сеанса SSL браузер
  • состояние аутентификации на карте соответствующего закрытого ключа
  • способ реализации промежуточного программного обеспечения.

В конце концов, с точки зрения безопасности, именно карта знает, когда «запрашивать» ПИН-код - некоторые карты и ключи требуют ПИН-код для каждой операции с ключом, некоторые карты в порядке, чтобы получить ПИН-код один раз и оставляйте ключи в аутентифицированном состоянии, пока они не будут удалены из считывателя или не сброшены приложением.

Если сеанс в кеше браузера нельзя использовать повторно или когда устанавливается соединение, промежуточное ПО для смарт-карт (PKCS # 11 в Linux, модуль CryptoAPI / BaseCSP в Windows или Tokend в OSX) должно разговаривать на ключи на карте. Если состояние аутентификации на карте требует ввода PIN-кода, браузер обычно вызывает обратный вызов. Или, если промежуточное программное обеспечение знает, что ему понадобится PIN-код, оно спросит его, прежде чем говорить с картой.

Не существует отношения 1: 1 между вводом ПИН-кода и фактической повторной проверкой прав доступа к закрытому ключу и повторной проверкой подлинности сеанса SSL.

При использовании стандартного SSL вы зависите от того, как SSL реализован в браузерах, и у вас не может быть 100% надежной «повторной аутентификации путем ввода PIN-кода» на стороне клиента.

Если вы используете Linux, то с OpenSC (который, AFAIK может использовать карты CAC) вы можете установить для параметра "Transactions_reset" в opensc.conf значение true, что приводит к сбросу карты после каждой транзакции (каждое согласование сеанса SSL) и таким образом вы можете быть уверены, что каждый раз, когда вы открываете новый сеанс SSL, пользователь должен вводить PIN-код снова. Однако это конфигурация на стороне клиента, а не функция, инициируемая сервером.

0 голосов
/ 11 мая 2016

Вы можете использовать функцию javascript, чтобы заставить браузер забыть о существующем кеше SSL в нескольких браузерах:

function logout() {
    // clear browser authentication cache
    // IE specific
    try
    {
        document.execCommand("ClearAuthenticationCache", "false");
    }
    catch(e)
    {
        // do nothing
    }

    // clear for firefox or any browser that supports window.crypto API
    if (window.crypto && typeof window.crypto.logout === "function") {
        window.crypto.logout();
    }
}

Вы можете использовать метод Javascript setTimeout, чтобы вызвать вышеуказанную функцию выхода из системы и, возможно, перенаправить их на страницу logout.aspx, чтобы заставить клиента ввести новый PIN-код.

Но он использует JavaScript, и код зависит от браузера и работает не для всех браузеров.

...