Как импортировать персональный сертификат в хранилище сертификатов ОС Windows из Chrome / Mozilla на стороне клиента

Я создал пару ключей и самоподписанный сертификат с помощью библиотеки JavaScript WebCrypto API и сторонний веб-сервис с помощью запроса CSR. Теперь я хочу сохранить сертификат с закрытым ключом в хранилище личных сертификатов Windows на клиентском компьютере. Я нашел здесь, что с помощью JavaScript это невозможно. Используя java, это легко возможно. Но поскольку jApplet сейчас не приветствуется, есть ли другой способ со стороны клиента. Возможно ли это, создав расширения chrome / mozilla?

Обратите внимание: я понимаю, что если я экспортирую сертификат как файл вместе с закрытым ключом, я могу импортировать его вручную в хранилище сертификатов Windows в качестве личного сертификата. Но я хочу автоматизировать этот процесс, например: пользователь просто заполняет форму из браузера и при взаимодействии с сервером, сертификат будет создан и будет храниться в магазине Windows клиента вместе с закрытым ключом.


person user1366645    schedule 21.03.2017    source источник
comment
С помощью WebCrypto вы можете создать пару ключей, но не сертификат. Вы запрашивали сертификат в ЦС с помощью CSR-запроса?   -  person pedrofb    schedule 21.03.2017
comment
Да, позвонив в стороннюю веб-службу с помощью CSR. Обновил вопрос. Спасибо @pedrofb   -  person user1366645    schedule 21.03.2017


Ответы (3)


Я не думаю, что у вас слишком много вариантов

  • Вы не можете получить доступ из javascript к хранилищу ключей, используемому браузером, из-за ограничений безопасности

  • Вы не можете создать расширение Chrome для доступа к хранилищу ключей, используемому браузером, потому что Chrome API не публикует его (я не уверен в firefox)

  • Вы не можете использовать апплет, потому что Java не поддерживается Chrome и Edge. Firefox прекратит поддержку подключаемых модулей NPAPI в марте 2017 г. (java использует npapi), а следующие версии Java не будут включать подключаемый модуль для браузера.

Альтернативы:

  • Создайте файл .p12 с закрытым ключом и сертификатом (на стороне клиента), загрузите и откройте его. Оперативная система запустит инструмент импорта сертификатов.

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

person pedrofb    schedule 21.03.2017
comment
Можете ли вы рассказать мне, как сгенерировать файл .pfx / .p12 с закрытым ключом и сертификатом на стороне клиента - javascript - person user1366645; 23.03.2017
comment
Вам необходимо использовать библиотеку javascript с поддержкой файлов PKCS # 12. См., Например, forge и pki.js. Создайте p12, извлекающий закрытый ключ из webcrypto, и получите сертификат и цепочку сертификации, возвращаемую сервером. См. Мой ответ здесь stackoverflow.com/questions/36018233/, чтобы узнать, как загрузить p12 в webcrypto. Вам нужен обратный процесс. - person pedrofb; 23.03.2017
comment
Спасибо @pedrofb Но похоже, что файл p12, созданный pki.js, нельзя импортировать в магазин Windows. - person user1366645; 28.03.2017
comment
Я не проверял эту функцию pki.js, но с forge мне это удалось. Предлагаю вам открыть новый вопрос с подробностями и примером - person pedrofb; 28.03.2017
comment
stackoverflow.com/questions/43066591/ @pedrofb - person user1366645; 28.03.2017

Прежде всего, javascript запускается в браузере внутри песочницы. Таким образом, у него очень ограниченный доступ к компьютеру, он может вычислять / генерировать данные, но не может вносить изменения в компьютер.

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

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

person GramThanos    schedule 21.03.2017
comment
Вы не можете запустить установщик из браузера. Прочтите ссылку, в принятом ответе предлагается использовать плагин NPAPI, который недоступен в Chrome более двух лет назад. В качестве альтернативы используйте Chrome Messaging Api или специальное расширение myinstaller: \, для которого необходимо предварительно установить программное обеспечение. - person pedrofb; 21.03.2017
comment
Во-первых, я не предлагаю ему использовать расширение, я даже сказал, что это бесполезно. Я посоветовал ему предоставить загружаемый exe-файл, который может установить сертификат (не вызывать установщика), чтобы пользователю не приходилось делать это вручную (просто запустите exe). Во-вторых, ссылка, которую я предоставил, объясняет больше о возможности запуска программы из google-chrome-extension, если это возможно или нет, и какая технология объясняется в ответах по ссылке, поэтому я сказал подробнее здесь. Я думаю, тебе следует читать, а не мне. - person GramThanos; 21.03.2017
comment
Вы не можете предоставить установщику сертификат, потому что у сервера нет закрытого ключа. Вам потребуется, чтобы установщик уже был установлен на компьютере пользователя, чтобы браузер мог вызвать его (с прокомментированными недостатками), чтобы предоставить сертификат для установки. Я не вижу в этом плюсов. Пользователю проще дважды щелкнуть файл .p12 и использовать установщик Windows по умолчанию, чем файл .exe, который должен запускаться браузером. - person pedrofb; 21.03.2017
comment
Опять же, я не поддерживаю идею вызова установленной программы из расширения, похоже, вы этого не понимаете. Кроме того, javascript может предоставить закрытый ключ для загрузки, а также exe, и есть много других способов сделать это. Прошу прощения, если мой ответ вас обидел, но мы опубликовали наши ответы примерно в то же время, поэтому я увидел ваш ответ после того, как опубликовал свой. Обычно я не публикую второй ответ, я комментирую первый, чтобы добавить информацию или свою идею. Я никогда не говорил, что мой ответ лучше или что ваш ответ хуже. - person GramThanos; 21.03.2017
comment
Я здесь, чтобы помогать людям, и размещение моей идеи не означает, что ваша идея плохая. С другой стороны, вы нападаете на меня, потому что вы неправильно поняли мой ответ, это не дух этого сайта. Это не соревнование, это помощь людям. К тебе, друг мой, плохо относишься, и я не собираюсь продолжать спорить о твоих проблемах. - person GramThanos; 21.03.2017

У нас та же проблема, но только в хроме. Нам удалось это сделать в Firefox (объект <keygen> в javascript) и IExpolorer (ActiveXObject). Учитывая Java-апплет, я предлагаю создать локальный микросервер с REST API и связываться с ним через SSL.

person macieg_b    schedule 13.07.2017