Подтвердить что ты не робот

Архитектуры для доступа к смарт-карте из общего браузера? Или: как устранить разрыв между браузером и ПК/SC?

Каковы возможные архитектуры на стороне клиента для доступа к локальной смарт-карте из обычного браузера (подключенного к серверу через http (s)), предпочтительно из Javascript, с минимальными трудностями при установке для конечного пользователя? Сервер должен иметь возможность, по крайней мере, выдавать APDU по своему выбору на карту (или, возможно, делегировать часть этого коду на стороне клиента, который он генерирует). Я предполагаю наличие на стороне клиента рабочего стека ПК /SC, в комплекте со считывателем смарт-карт. Это разумное предположение по крайней мере для Windows, начиная с XP, современных OS X и Unixes.

До сих пор я определил следующие варианты:

  1. Некоторые пользовательские ActiveX. То, что использует мое существующее приложение (мы разработали его собственными силами), развертывание довольно просто для клиентов с IE, когда они получают разрешение на установку ActiveX, но оно не соответствует требованию "универсального браузера".
    Обновление: ActiveX поддерживается в основном устаревшим IE, включая IE11; но не по краю.
  2. Некоторые расширения для ПК /SC-браузеров используют Netscape Plugin API, который выглядит как плавное расширение вышеперечисленного. Единственный готовый продукт, который я нашел, - это SConnect, но он кажется едва живым, его документация по API (веб-архив) более не доступна официально и имеет тесные связи с конкретным поставщиком смарт-карт. Принцип может быть хорошим, но создание такого плагина для каждой платформы было бы большой работой.
    Обновление: поддержка NPAPI прекращена многими браузерами, включая Chrome и Firefox.
  3. Java-апплет, работающий поверх Oracle JVM (1.) 6 или выше, который поставляется с javax.smartcardio. Это хорошо с функциональной точки зрения, хорошо документировано, я могу жить с несколькими известными ошибками, но я боюсь непреодолимой нисходящей спирали в отношении принятия расширения Java-as-a-browser-extension.

Любая другая идея?

Кроме того: существует ли какой-либо способ предотвратить злоупотребление интерфейсом ПК /SC, который имеет браузер, мошенническим сервером (например, представить 3 неправильных ПИН-кода для блокировки карты, просто из-за ее гнусности или совершения еще более злых дел).

4b9b3361

Ответ 1

Обновление (8/2016): новый API для веб-сайта API WebUSB. Вы можете уже использовать его с Chrome v54 +.

Этот стандарт будет реализован во всех основных браузерах и заменит необходимость сторонних приложений или расширений для карт Smard: -)

Итак, новый ответ: YES!

И стек архитектуры, подобный OSI:


Примечание. Google анонимно, что они откажутся от Chrome Apps в 2017 году.

Предыдущий anwser:

Теперь (2015) вы можете создать приложение Google Chrome, используя chrome.usb API.

Затем вы получаете доступ к считывателю смарт-карт через свой интерфейс, совместимый с CCID.

Это не кросс-браузер, а JavaScript программируемый и кросс-платформенный.

В любом случае API-интерфейс Netscape Plugin API (NPAPI) больше не поддерживается современными браузерами. И Java-апплеты увольняются разработчиками браузеров.

Ответ 2

Дело в том, что браузеры не могут разговаривать с (криптографическими) смарт-картами для других целей, кроме установления SSL.

Вам должен нужен дополнительный код, выполняемый браузером, для доступа к смарт-картам.

Существуют десятки пользовательских и проприетарных плагинов (с использованием всех трех опций, которые вы упомянули) для различных целей (подпись, являющаяся наиболее популярной, я думаю) построенной, потому что нет стандартного или общепринятого способа, по крайней мере в Европе, в другом месте также.

Создание, распространение и поддержание ваших собственных данных должно быть взрывом, поскольку браузеры выпускаются каждый месяц или около того, и каждый новый релиз изменяет sanboxing ir UI-трюки, поэтому вам может понадобиться довольно часто корректировать код.

И вы, вероятно, захотите иметь возможности графического интерфейса, по крайней мере, для того, чтобы просить разрешение пользователя получить доступ к карте или некоторые функции на ней.

Для создания многоплатформенного плагина с несколькими браузерами можно использовать что-то вроде firebreath.

Лично я не считаю, что обнародовать PC/SC в Интернете - это хорошо. PC/SC по своей природе представляет собой протокол низкого уровня, который при экспонировании можно также предоставить доступ к блочному уровню на ваш диск и надеяться, что "приложения в Интернете являются моими только и они ведут себя хорошо" (это должно ответить на ваш вопрос "Также" ). В то же время тонкая прокладка, подобная SConnect, проще всего создать, для обеспечения кода стиля javscript plugin.sendAPDU() (или просто обернуть весь API ПК /SC и позволить вызывающему javascript позаботиться о том же уровне детализации как в случае использования нативного PC/SC API-интерфейса).

Создание плагина для этой цели обычно обусловлено острой нехваткой тока.

Обращение к будущему (мобильное устройство и т.д.) - это еще одна история, где такие вещи, как W3C webcrypto и OpenMobile API, вероятно, наконец-то создадут что-то, что предоставляет контейнеры для клиентских ключей для веб-приложений. Если ваша цель с помощью смарт-карт - криптография, мое предложение - избегать ПК /SC и использовать сервисы платформы (CryptoAPI для Windows, Keychain на OSX, PKCS # 11 в Linux).

В любом виде конструкции есть требования. Все это применяется, если вы подумываете использовать ключи, а не произвольные APDU. Если ваше требование - отправить произвольные APDU, создайте плагин и просто пойдите с ним.

Ответ 3

Я только что выпустил бета-плагин, решая эту проблему. Этот бета-код доступен здесь:

https://github.com/ubinity/webpcsc-firebreath

Этот плагин основан на инфраструктуре firebreath и был протестирован с помощью FireFox и Chrome под Linux/WinXP/Win7. Исходный код и добавочный пакет предоставляются.

Основная идея - предоставить доступ к API-интерфейсу PCSLite, а затем разработать более дружественный JS-api поверх этого.

Этот плагин находится в активной разработке, поэтому не стесняйтесь отправлять любой отчет и запрос.

Ответ 4

Для вашего первого вопроса у меня мало надежды: либо вы довольны очень небольшим подмножеством функциональности смарт-карт (например, подписью электронной почты или PDF файлов), тогда вы можете использовать некоторое готовое программное обеспечение (например, PKCS), в идеале поддерживаемых компанией смарт-карт, или вам нужны более широкие функциональные возможности и необходимо самостоятельно прилагать значительные усилия. Конечно, PCSC является отправной точкой для выбора.

По крайней мере, для вашего "также:" есть надежда.

1) Обратите внимание, что некоторые спецификации (например, ICAO/German BSI TR-3110) запрашивают метод, в котором PIN-код не заблокирован, но использует значительное количество времени, как только счетчик ошибок достигает 1 перед ответом. Окончательная попытка должна быть активирована с использованием другой команды, в противном случае дальнейшие сравнения и коррекция счетчика ошибок не выполняются.

2) Просто защитите команду Verify, требуя безопасного обмена сообщениями. В чувствительных приложениях используется безопасный обмен сообщениями для всего, поэтому первый шаг сбрасывается с помощью сеансового ключа, который второй применяется ко всем последующим командам и ответам. Эффект будет заключаться в том, что команда отклоняется из-за неправильных MAC-адресов задолго до того, как будет выполнено сравнение или изменение счетчика ошибок.

Ответ 5

Существует еще один плагин для браузера, подобный тому, который был предложен с помощью @cslashm, доступным по адресу http://github.com/cardid/WebCard. Является также открытым исходным кодом и может быть установлен с "минимальной сложностью установки", как того требует исходный вопрос. Вы можете увидеть пример использования посещения http://plugin.cardid.org

WebCard была протестирована в IE 8-11, Chrome и Firefox в Windows и в Chrome и Safari в Mac OS X. Поскольку это всего лишь оболочка для ПК /SC, в Mac OS X требуется установка сервисов SmartCard с http://smartcardservices.macosforge.com

Ответ 6

Как хром и firefox перестанут поддерживать плагин NPAPI, нет безопасного решения для поддержки сеанса для чтения смарт-карт, вместо этого у вашего сертификата карты есть поддержка взаимного ssl, я ответил на аналогичный вопрос < источник href= "/questions/139925/npapi-plugin-support-or-similar-for-reading-smartcards/829983#829983" > , он может помочь

Ответ 7

Его грязный, но если его приемлемо/целесообразно установить демон/службу моста на клиентской машине, вы можете написать локальную службу моста (например, на python/pyscard), которая предоставляет смарт-карту через интерфейс REST, а затем javascript в браузере, который посредничает между этой локальной службой (фасад) и API удаленного сервера.

Ответ 8

Говоря о Chrome, вы можете теперь использовать приложение для подключения смарт-карт от Google, которое связывает порт ПК /SC -Lite и общий CCID.

Само приложение работает через chrome.usb API, о котором говорили предыдущие комментаторы.

Итак, вместо того, чтобы переписывать весь стек (начиная с самого низкого уровня - raw USB), теперь разработчикам теперь можно закодировать только ту часть, которая работает поверх API ПК /SC, - которая открывается через приложение Connector.

Ответ 9

Клиенты, клиенты, клиенты... плагины,.. JSApis.. Что ж.. Наверняка мы это знаем: все браузеры при общении с серверами Apache или IIS фактически подписывают " что-то", когда требуется процесс установления связи https/SSL.

Например, типичная конфигурация Apache, например:

SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +FakeBasicAuth +StdEnvVars +ExportCertData +OptRenegotiate

Инициирует PIN-код, и пользователь должен вставить вывод смарт-карты для продолжения.

Ну, моя идея: почему бы не сделать поворот на сервер и не настроить это поведение, чтобы выгрузить поток событий, чтобы что-то подписать, когда инициируется рукопожатие?

Ответ 10

У меня есть настройки, где читатель смарт-карты сканируется для входа в систему пользователя. Библиотека PC/SC отлично работает на рабочем столе. Кто-то упомянул об использовании Emscripten (https://github.com/kripken/emscripten) компилятора, который компилирует c++ в код JavaScript. Но это не сработало, потому что некоторые функции, используемые PC/SC, доступны только на стороне сервера. После долгих исследований. Я наконец отказался от решения на стороне клиента, chrome web usb API также не смог распознать читателя.
Затем я решил попробовать signalR и настроить концентратор на ПК, подключенном к устройству чтения смарт-карт, и этот подход сработал очень хорошо.

Ответ 11

Используйте расширение браузера для доступа к смарт-карте или USB-токену

Java-апплеты, Active X и т.д. Уже сняты с эксплуатации или выводятся из новых современных браузеров. В последнее время много говорят об API WebCrypto, но на данный момент API WebCrypto не предоставляет доступ к (Windows) или любым другим хранилищам ключей или локальному устройству шифрования USB/Smartcard.

Для аутентификации через браузер с использованием цифровой подписи и подписи в формате PDF или eReturn, одним из таких бесплатных расширений Chrome является расширение Signer.Digital chrome. Установку локальной системы (хост, работающий за браузером Chrome в Windows) можно загрузить с https://signer.digital/downloads/Signer.Digital.Chrome.Host.Setup.zip. При установке и перезапуске Chrome автоматически добавляется Signer.Digital. Расширение Chrome

Фактическая работа этого расширения иллюстрируется здесь

Шаги тестирования:

  1. Установите драйверы устройств для вашего USB-токена или смарт-карты - это должно сделать ваш сертификат в хранилище сертификатов Windows

  2. Установите настройки, указанные выше.

  3. Перезапустите браузер Chrome.

  4. Откройте эту ссылку

  5. Введите UserID & Password и нажмите кнопку Register - здесь будет предложено выбрать цифровую подпись и зарегистрировать ее на сервере (только для этого сеанса - не постоянно).

  6. Затем снова введите одинаковые UserID и Password, выберите тот же сертификат и нажмите Login. Выбор другого сертификата не позволит войти в систему.

JavaScript для вызова метода из расширения:

Чтобы зарегистрировать сертификат на сервере:

//Get Selected Certificate Information 
SignerDigital.getSelectedCertificate()
    .then(
        function (CertInfo) {        
    //Success returns Certificate Subject and Thumbprint
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

Для аутентификации или авторизации с использованием цифровой подписи:

SignerDigital.signAuthToken(authToken, "SHA-256")       //or "SHA256"
    .then(
        function (SignData) {        //Success returns Signed Auth Token
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

Чтобы подписать PDF:

    //Calculate Sign for the Hash by Calling function from Extension SignerDigital
    SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256")      //or "SHA256"
     .then(
            function (signDataResp) {
              //Send signDataResp to Server
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

Если не удалось: возвращает сообщение об ошибке, начиная с "SDHost Error:"