Назад | Перейти на главную страницу

Управление доступом к моему API с помощью открытого ключа SSH (не SSL)

Передо мной стоит задача реализовать API, который будет использоваться относительно нетехническими клиентами - вставка некоторого образца кода в их WordPress или собственный PHP-сайт, вероятно, все, что мы можем попросить. Их не просят установить SSL на свои серверы. Поэтому я ищу простой, но безопасный способ аутентификации клиентов API.

OAuth - очевидное решение, но я не думаю, что он проходит «простой» тест.

Добавление идентификатора клиента и хешированного секрета в качестве параметра к запросам ближе - это не сложно сделать md5($secret . $client_id) или что бы там ни было.

Мне кажется, что если клиентские запросы могут использовать тот же подход, что и открытые ключи SSH (клиент дает нам ключ со своего сервера (ов), должна существовать какая-то магия, чтобы все последующие транзакции прозрачно работали так же, как обычные запросы HTTP API .

Я все еще работаю над этим (очевидно :-), поэтому, если я идиот, было бы неплохо знать, почему.

Спасибо!

Это довольно большая тема, ваш API - чисто веб-интерфейс? Почему SSL слишком сложен? Если вам нужна надежная связь от автоматических клиентов и гарантия неотказуемости, вам понадобится SSL. Если доступ к вашему API осуществляется из пользовательского сеанса, можете ли вы реализовать двухфакторную аутентификацию. Используя что-то вроде токенов RSA или даже аутентификатора Google, если у них есть смартфоны.

Нечто похожее на открытые ключи SSH - это проверка подлинности сертификата клиента SSL, также известная как двухсторонний SSL.

Если вы размещаете услугу, вы можете настроить SSL на своей стороне. Есть несколько вариантов аутентификации клиентов.

  1. Вы можете использовать токен, как вы сказали в вопросе.
  2. Вы можете использовать http auth и указать им имя пользователя и пароль.
  3. Вы можете использовать клиентские сертификаты SSL, как сказал Мирча.
  4. Вы можете основывать его на подключенном IP-адресе.

Самый простой способ - включить HTTP-аутентификацию на своей стороне. При условии, что вы включили HTTPS на своем сервере и убедились, что клиенты настроены с https:// URI (не полагаться на автоматические перенаправления, особенно с HTTP Basic на самом деле). Просто дайте каждому зарегистрированному клиенту имя пользователя и пароль.

Большинство клиентов должны поддерживать эту форму аутентификации. Если ваш клиент - сервер PHP, установка CURLOPT_USERPWD параметры стоит сделать.

Также довольно часто используется ключ API (на основе некоторого UUID, например) в качестве параметра запроса для некоторых API. Насколько это удобно, может зависеть от вашей стороны кода. В целом, с точки зрения безопасности, это эквивалентно базовому имени пользователя / паролю (за исключением того, что вам, возможно, придется сопоставить ключ с именем пользователя).

Если вы хотите использовать аутентификацию с открытым ключом, используйте клиентские сертификаты SSL / TLS. Это более сложно. Возможно, вам придется создать для этого свой собственный центр сертификации (это можно сделать таким образом, чтобы генерация ключей производилась в браузере пользователя, но это все равно может быть неудобно).1

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

В любом случае, если на вашей стороне используется SSL, и вы ожидаете, что они вставят некоторый код PHP / Curl, им все равно, возможно, придется выполнить небольшую настройку. По крайней мере, CURLOPT_SSL_VERIFYPEER должно быть TRUE, CURLOPT_SSL_VERIFYHOST должно быть 2 (по умолчанию) и CURLOPT_CAPATH должен указывать на каталог, содержащий их доверенные сертификаты CA. Где это, может зависеть от их хозяина.

1 Также можно превратить ключ SSH RSA в самозаверяющий сертификат X.509, но это довольно технический вопрос (и также потребует некоторой работы с вашей стороны). Другие механизмы аутентификации с открытым ключом (возможно, на основе ключей SSH) поверх HTTP должны быть созданы вами, что, как правило, является плохой идеей (трудно реализовать самостоятельно). Это, конечно, не стоит усилий, поскольку HTTPS с аутентификацией клиента предоставит вам что-то проверенное и уже поддерживаемое существующими библиотеками.

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

Пожалуйста, посмотрите это http://p4r1tyb1t.com/?p=723