Вход в систему с использованием открытого / закрытого ключа ssl? - PullRequest
8 голосов
/ 21 сентября 2011

Можно ли создать процесс входа в систему, который требует открытый / закрытый ключ через веб-браузер?Открытый ключ будет храниться на сервере, а закрытый ключ будет храниться (и шифроваться) пользователем.

Я в основном хочу сделать что-то похожее на то, что делает SSH, но через Интернет.Возможно, это собственный метод HTTP-аутентификации (отличный от «дайджеста»).

Я знаю, что это невозможно сделать с помощью стандартного браузера, поэтому расширения для этой работы приемлемы (Chrome / Firefox).

В идеале ключи должны быть зашифрованы на USB-накопителе.Когда USB-накопитель отключен, вход в систему должен быть невозможен (не требуется, чтобы браузер кэшировал его).

Это будет использоваться для внутреннего использования.

Редактировать: Клиентские сертификаты - это то, что я ищу, но как мне сохранить эти сертификаты на USB-накопителе?Кроме того, есть ли информация о том, как аутентифицировать пользователя с помощью PHP?

Ответы [ 5 ]

4 голосов
/ 21 сентября 2011

Это аутентификация клиента по сертификатам.
Ваш сервер должен быть настроен на требование сертификата клиента, а также настроен с хранилищем доверенных сертификатов.
Все браузеры поддерживают это.
Вам просто нужно импортировать клиентское хранилище ключей, имеющее закрытый ключ и сертификат, в набор сертификатов компьютеров.
Для окон это в настройках интернета

2 голосов
/ 10 августа 2014

Вот как я сделал веб-вход с использованием открытого / закрытого ключа RSA в php:

  • При регистрации сервер сохраняет открытый ключ пользователя и дает ему идентификатор
  • При входе в системупользователю предлагается ввести свой идентификатор и закрытый ключ

Регистрация очень проста.

Но вход в систему осуществляется следующим образом:

  • Сервер генерируетстрока, содержащая некоторые данные: случайная строка, текущее время, ip пользователя
  • Эта строка дважды шифруется с помощью AES с двумя паролями: nonce1 = pass2( pass1( string ) )
  • Эта же строка снова шифруется с помощью AES с двумяпароли, но в обратном порядке: nonce2 = pass1( pass2( string ) ) и результат зашифрован с помощью открытого ключа пользователя: nonce2encrypted = encryptPubKeyRSA( userPubKey, nonce2 )

PS Строка зашифрована двумя паролями, чтобы было сложнее проводить атаку методом перебора.

Форма входа содержит три скрытых ввода: nonce1, nonce2encrypted и nonce2 без значения.

Затем пользователю предлагается ввести свой закрытый ключ в текстовой области, котораянаходится вне <form> тег (чтобы убедиться, чтоесли он не будет отправлен на сервер при отправке формы) , JavaScript расшифрует nonce2encrypted и установит дешифрованное значение nonce2.Затем текстовое поле с закрытым ключом удаляется из html с помощью javascript, просто чтобы быть уверенным, что оно не будет сохранено где-либо в браузере или отправлено на сервер.

Сервер получает nonce1 и nonce2, ирасшифровывает их с помощью этих двух паролей.Если дешифрованные значения совпадают, пользователь получает файл cookie и входит в систему.

PS Этот файл cookie также содержит некоторые зашифрованные данные, например, ip пользователя.Это не позволяет кому-то, кто украл этот cookie, войти в систему с другого ip.

Вы можете просмотреть этот метод в действии ( проект на github )

2 голосов
/ 21 сентября 2011

Я сомневаюсь, что вы сможете сделать это с помощью веб-приложения.Браузер изолирован от операционной системы, и веб-приложение не сможет обнаружить наличие USB-накопителя, а также не сможет прочитать с него какие-либо данные с помощью веб-приложения.Поэтому вам потребуется браузер, чтобы сделать это за вас, и он не предназначен для такой работы.

Когда вы загружаете сертификат клиента в браузер, он загружается в хранилище сертификатов.Они различаются в зависимости от браузера и ОС.На OSX они идут в KeyChain.В Windows некоторые перейдут в хранилище ключей ОС, а некоторые - в собственное хранилище ключей браузеров (я думаю, Firefox работает таким образом).Но ни один из них не позволит вам определить внешнее хранилище ключей, а затем зашифровать и расшифровать ключ, который вы пытаетесь защитить, при чтении и записи с этого диска.

То, что вы делаете, будет возможно только в том случае, если вынаписал свое собственное настольное приложение (по сути, собственный браузер), которое сделало это для вас

Возможно, вы могли бы сделать это с помощью приложения Adobe AIR.Adobe AIR поддерживает чтение и запись с USB-накопителя, поддерживает зашифрованные базы данных (128-битное шифрование AES / CBC с SQLite), где вы можете хранить данные, которые вы пытаетесь защитить, и это кросс-платформенное.

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

Чтобы достичь этого уровняконтролировать вам, возможно, придется взглянуть на действительно нативное решение.C ++, Objective-C или Java.Java будет единственной, которая предложит вам кроссплатформенное решение.

Если USB-ключ удобен для конечного пользователя, а не является обязательным требованием, тогда Adobe AIR станет надежным решением.Если нет, то пришло время освежить свои навыки разработки программного обеспечения для настольных компьютеров.

1 голос
/ 19 апреля 2014

Ответ на ваш вопрос «сегодня невозможен».

Технология существует сегодня в форме сертификатов, которые поддерживаются уже во всех браузерах.Но чтобы получить то, что вы хотите, браузеры должны были бы разрешить добавление сертификатов и управление ими в части «менеджер паролей» своего пользовательского интерфейса.Люди хотят синхронизировать их между устройствами и т. Д.

Кроме того, веб-сайтам потребуются аналогичные изменения, чтобы пользователи могли управлять открытыми ключами, хранящимися на веб-сайте, вместо управления их паролем.

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

0 голосов
/ 21 сентября 2011

Клиентские сертификаты являются ответом. Большинство / Все браузеры импортируют эти клиентские сертификаты как PKCS # 12 (.p12, .pfk).

Можно преобразовать существующий сертификат x509 в файл PKCS # 12 с открытым ключом (.crt), закрытым ключом (.key) и сертификатом CA (.crt). Вы можете сделать это с OpenSSL, используя следующую команду:

openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile ca.crt

Если вы подписываете сертификаты самостоятельно, важно убедиться, что серийный номер сертификата отличается от других сертификатов. Если они совпадают, вы можете столкнуться с ошибками при попытке импортировать файл .p12 (так что следите за -set_serial в примерах openssl).

К сожалению, единственный кроссплатформенный способ сделать сертификаты мобильными / съемными - это использовать смарт-карту (используя PKCS # 11).

В Mac OS X Safari и Chrome получают доступ к своим сертификатам из цепочки для ключей. Вы можете создать собственную цепочку для ключей на USB-накопителе (Файл -> Новая цепочка для ключей). После создания цепочки для ключей вы можете просто перетащить файл .p12 в свою цепочку для ключей. Что приятно, так это то, что вы можете контролировать доступ к тому, какое приложение имеет доступ к сертификатам, и вы можете иметь блокировку самой цепочки для ключей после определенного периода бездействия.

С Safari это прекрасно работает. Если вы отключите флэш-накопитель, он прекратит отправку этого сертификата через пару секунд. Если вы подключите его обратно, он сразу же поднимет его. Если вы заблокируете сертификат с помощью «Keychain Access», он запросит пароль. Он не позволяет правильно извлечь флэш-накопитель во время использования, но через минуту Safari снимает блокировку.

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

Похоже, что Safari - единственный браузер, который поддерживает это. Firefox и Opera имеют свои собственные хранилища ключей.

Если вы хотите спрятать свою пользовательскую цепочку для ключей на флэш-диске, вы можете создать невидимую папку с префиксом в виде точки (например, «./.keys»). При создании цепочки для ключей вы можете просмотреть невидимую папку в диалоговом окне, нажав Ctrl + Shift + ".".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...