Цифровая подпись PDF в современных браузерах Firefox / Chrome / Edge - PullRequest
3 голосов
/ 29 апреля 2019

Я пробежал несколько кроличьих норов в поисках ответа на этот вопрос.

У меня есть веб-приложение, написанное на AngularJS, для которого в настоящее время требуется IE11 и плагин Acrobat для цифровой подписи формы PDF.Однако плагин является мусором в IE11 и не поддерживается в современных браузерах (которые я определяю как Firefox, Chrome и Edge. Safari не будет поддерживаться моей компанией).

Поскольку приложение - AngularJS (иНЕ работает на узле), мне нужно решение JavaScript, чтобы подписать PDF.Мало того, но сертификаты подписи хранятся на смарт-карте, а это означает, что мне нужна криптографическая библиотека, которая может получить доступ к сертификатам через некоторый интерфейс PKCS # 11.В JavaScriptВнешнее открытие форм в Acrobat в настоящее время неприемлемо для клиента.

Я просмотрел несколько библиотек, не имея возможности найти прямой ответ:

  • PKI.js
  • pkcs11.js
  • hwcrypto.js
  • graphene.js

Ни один из этих пакетов не предоставляет мне достаточно информации, чтобы знать, исследовать ли ихдалее.

Может ли кто-нибудь предоставить мне дополнительную информацию или направление?

Спасибо, Джейсон

Ответы [ 2 ]

1 голос
/ 18 мая 2019

@ Джсон, ты сказал: "это не то, что я хотел услышать, но я приму твой ответ". !!

Я бы предложил использовать расширения браузера для цифровой подписи pdf, файлов или чего-либо из современных браузеров. Расширение браузера будет подключаться между браузером, предоставляющим JavaScript, браузеру, подключающемуся к локальному узлу (приложению) расширения и имеющему доступ к CertStore.

Наша компания опубликовала одно такое расширение и бесплатно, которое использует .NET Framework 3.5, которое обычно доступно на всех клиентах Windows. Он не использует PKCS # 11, просто устраняя необходимость предоставлять драйверы PKCS # 11 и т. Д., И просто работает прозрачно после успешной установки. Используется Windows CertStore.

Согласно вашему комментарию, у вас есть больше клиентов, использующих Firefox, но у нас есть расширения Edge и Firefox в разработке.

Настройка (для хост-приложения, работающего за браузером Chrome в Windows) может быть загружена с https://download.cnet.com/Signer-Digital-Chrome-Extension/3000-33362_4-78042540.html После установки этого хоста и перезапуска Chrome автоматически добавится расширение Signer.Digital Chrome

.

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

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

    //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.
              }
     );

В случае успеха возвращает закодированную в Base64 подпись pkcs7 - используйте любую подходящую библиотеку для вставки подписи в pdf Если Ошибка, возвращает сообщение об ошибке, начиная с «Ошибка SDHost:»

Надеюсь, это поможет!

1 голос
/ 29 апреля 2019

Этот ответ направлен на обходные пути, а не на реальные ответы.

Это потому, что на данный момент в браузере нет API , который можно использовать для получения закрытого ключа сертификата смарт-карты и его использования.Это якобы обсуждалось в Web Crypto API, и, насколько я помню, был достигнут консенсус, что это не должно поддерживаться по соображениям безопасности (с чем я категорически не согласен!).

Вам, как и сотням или тысячам других разработчиков (включая нас), не повезло.

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

Приложение использует серверные API для первого получения документа, который пользователь собирается подписать.Затем приложение использует локальное хранилище сертификатов без ограничений (так как это обычное приложение для настольных компьютеров), шифрует документ и отправляет его обратно на сервер.

Плюсы: Приложения ClickOnce можно вызывать из браузера.

Минусы: это требует .NET времени выполнения на клиенте.

Второй обходной путь включает настольное приложение Java, которое устанавливается независимо на компьютере клиента.Вы предоставляете установочные пакеты для выбранных ОС (скажем, Windows, Linux, MacOS), пользователь загружает установочный пакет и устанавливает приложение в свою ОС.

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

  • push-службой, которая принимает данные документа для подписи
  • сервис извлечения, который предоставляет подписанный документ, когда он доступен

Как вы думаете, браузер выполняет запрос, браузер запрашивает localhost:port и загружает данные документа вПуш сервис.Приложение Java переключается с в ожидании документа на , подписывающего состояние документа.Пользователь должен использовать приложение - выбрать сертификат из магазина (без ограничений, поскольку это обычное приложение Java для настольных компьютеров) и подписать документ.Ваш браузер в фоновом режиме пингует сервис извлечения приложения, и когда данные готовы, браузер загружает их.Затем браузер загружает подписанный документ на фактический сервер, используя фактический сеанс с проверкой подлинности.

Здесь есть потенциальная дыра в безопасности, поскольку любое локальное приложение или любая открытая веб-страница может пропинговать службу извлечения и загрузить документ(что, конечно, вы не хотите).Нам известно о двух исправлениях этого.

Во-первых, в приложении Java может быть еще одна служба, которая возвращает токен одноразовой аутентификации (например, guid), который предназначен для чтения один раз, а затемпоставляется с каждым вызовом службы извлечения в качестве маркера аутентификации.Если какое-либо другое вредоносное приложение или веб-страница прочитает токен до веб-страницы вашего приложения, ваша страница получит ошибки от службы извлечения (так как одноразовый токен был, очевидно, украден и недоступен).Здесь веб-страница может сигнализировать об ошибке связи и предупреждать пользователя о потенциальной проблеме безопасности.

Второй способ устранения дыры заключается в аргументе вызова службы извлечения, который предоставляется сервером приложений и помещается в скрипт страницы в качестве значения, токена, подписанного сертификатом сервера.Ваше приложение Java может иметь открытый ключ сертификата сервера, чтобы приложение Java могло проверить подпись аргумента.Но никакое другое приложение (и никакая другая страница) не сможет подделать токен (так как закрытый ключ подписи токена доступен только на вашем сервере), и нет простого способа украсть действительный токен из тела страницы.

Плюсы: приложение Java может быть нацелено на несколько ОС. Минусы: для этого по-прежнему требуется время выполнения Java на клиенте

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

...