Существует два способа аутентификации клиента с помощью смарт-карты в Интернете: стандартный 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-код снова. Однако это конфигурация на стороне клиента, а не функция, инициируемая сервером.