Альтернатива для цифрового подписного апплета в Chrome

В настоящее время мы разработали систему, которая может подписывать документы с помощью java-апплета. Однако с запретом апплетов под хром мы ищем альтернативное решение для цифрового подписания.

В настоящее время подписание работает следующим образом:

  • HTTP GET отправляется сервлету, чтобы получить документ, который будет подписываться;
  • Апплет запускается, драйвер цифровой подписи извлекается из файловой системы, и пользователь вводит PIN-код;
  • Апплет получает цепочку сертификации, проверяет CRL/OSCP и подписывает документ;
  • Апплет отправляет многостраничную запись с уже подписанным файлом в сервлет в системе.

Одним из альтернативных решений будет импорт сертификата в браузере и использование js для подписи. Но это не будет удобным для пользователя решением.

Другим решением может быть попросить пользователя загрузить запуск программы с использованием JNLP, которая загружает и подписывает документ и автоматически загружает его с помощью HTTP multipart POST. Недостатком этого подхода было бы то, что он требует дополнительных пользовательских взаимодействий (действие загрузки), и мы теряем сеанс http-браузера, поэтому нам нужно снова аутентифицироваться.

Что более жизнеспособно? Можете ли вы подумать об альтернативе?

Ответ 1

Все сообщения ниже предлагают подписку на основе RSA.

Вы можете подписать его в чистом Javascript + Web Crypto api.

Ключевые моменты: извлечение ключа с тегом HTML5 <file>, использование forge js library для работы с ключами и хэшами и canonize xml с deoxxa и использовать веб-криптографию для подписывания/проверки (кроме того, forge также может подписываться/проверяться, но веб-крипто быстрее).

Если вы подписываете xmls с исключительной канонизацией, используйте deoxxa (вы должны его прокси-серверу перед использованием). Если вы подпишете xml и вам нужно включить инклюзивную канонизацию, используйте мою вилку deoxxa (размещенную на собственном сервере gitlab). Я был слишком ленив, чтобы переименовать эксклюзив в include, но мой .js файл работает включительно, поверьте мне) Пример использования forge + deoxxa + html5_p12_file_read в signJs, verifyJs files.

Кроме того, forge поддерживает подписание двоичных файлов (CMS или более старый стиль имен PKCS # 7), но в моих JSP файлах нет такого примера. О OCSP и тестовом тестировании в JS-I открыли проблему в кузнице, но, похоже, слишком сложно обрабатывать протоколы CRL/OCSP и TSP в JS, почему вы можете подписывать JS, но проверка может быть разделена - проверка хэша выполняется в JS (использование forge и дополнительный код, показанный в моем JSP), но в вашем веб-сервисе выполняются интеллектуальные проверки, такие как CRL, цепочка и т.д. - вы можете извлечь сертификат X509 и отправить его к вашему веб-сервису и использовать bouncycastle или любую другую классную библиотеку для интеллектуальных проверок. X509Certificate - это общедоступная информация, без проблем при отправке ее на обслуживание, но проверка дайджестов требует наличия файлов, и вы можете не отправлять файлы в службу и, таким образом, использовать кузницу для проверки дайджеста, которая отображается в моем файле подтверждения.

Мой JS-код не реорганизуется и даже не работает в ООП, и в настоящее время я не работаю над этим проектом, но на каком-то этапе у меня была полная работа xml RSA, играющая с ключами p12 в файловой системе.

Последний JSP в моем репо использует forge только для разбора файлов p12 и предоставления ключей от них API веб-криптографии, но в моей истории репо также есть чистый знак/проверка Javascript (если вам не нравится веб-крипто api). см. историю ветвей проекта.

Ответ 2

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

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