Закрепление открытого ключа TLS с помощью PHP + Curl?



Я хотел бы установить связь между двумя приложениями, защищенными через TLS 1.2, в котором закреплены открытые ключи конечных точек. (Нет сертификации, участвующих.)



Далее, я даже не хочу иметь дело с сертификатами; только открытые ключи RSA / ECDSA.



В частности, они оба являются приложениями PHP, и я использую curl для облегчения связи.



Кто-нибудь делал это раньше?

771   3  

3 ответов:

(никаких центров сертификации не задействовано.)

По умолчанию curl настроен на то, чтобы не доверять никаким CAs. Так вот оно что. И не вдаваясь в подробности или ответы, основанные на мнении, вот хорошо организованная "прикрепляющая шпаргалка", которая может вам помочь: https://www.owasp.org/index.php/Pinning_Cheat_Sheet (нет необходимости в щедрости

Наконец, эта функция была реализована в PHP, и вы также можете использовать ее в более старых версиях PHP, пока ваша версия cURL достаточна!

Требования

  • PHP v7.0.7 или выше (ниже показан трюк, чтобы заставить его работать с более ранними версиями)
  • завиток v7. 39 или выше

Подготовка (получение булавок)

Для закрепления можно использовать хэши SHA-256 открытого ключа(ов) в формате DER. Не путайте это с сертификатом отпечатки пальцев! Вы закрепите открытые ключи, а не сертификат здесь.

Лучше всего обратиться к официальной документации cURL для извлечения этих ключей. Однако может быть и более простой способ: формат выводов такой же, как и в HPCP. Таким образом, если веб-сервер использует HPKP , я настоятельно рекомендую вам использовать хэши, которые он отправляет туда! вы можете просто скопировать и вставить их из заголовка. Вам просто нужно немного изменить формат, как показано на рисунке под.

Public-Key-Pins: pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; max-age=5184000;

Добирается до:

Sha256//cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=;sha256//M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjahkhpgpwe

Однако обратите внимание, что есть одна большая разница между HPCP и CURL CURLOPT_PINNEDPUBLICKEY: в HPCP вы можете закрепить открытые ключи промежуточных сертификатов, при использовании CURL вы в настоящее время не можете этого сделать!

Поскольку существует уже много руководств для HPKP, вы также можете найти другие хорошие руководства для создание этих хэшей. Вот, например, один лайнер, использующий существующий файл сертификата Скотта Хелме :

openssl x509 -pubkey < tls.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

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

Sha256/ / Base64EncodedHashOfPublicKey; sha256//Base64EncodedHashOfAnotherPublickey

Кроме того, вы можете указать путь к файлу сертификата, если хотите.

Использование в PHP

В PHP вы можете впоследствии использовать его следующим образом:

<?php
// this line makes it possible to use that option in PHP < 7.0.7
defined('CURLOPT_PINNEDPUBLICKEY') || define('CURLOPT_PINNEDPUBLICKEY', 10230);

$ch = curl_init("https://example.com");
curl_setopt($ch, CURLOPT_PINNEDPUBLICKEY, "YourPinsHere!!");
// ...

После этого вы должны проверить его, указав недопустимый pin-код. Если он не дает сбоя, то либо ваши требования не выполняются, либо вы допустили ошибку при его реализации. Вы также можете проверить его на консоли с этим команда:

Завиток https://example.com -- pinnedpubkey " YourPinsHere!!"

Я не знал решения, но могу предложить вам несколько направлений для открытия:

  1. Взгляните на http://php.net/manual/en/function.curl-setopt.php В частности, в опции CURLOPT_SSH_HOST_PUBLIC_KEY_MD5. Это не позволяет проверить полный открытый ключ, только его хэш md5.

  2. В качестве другого варианта вы можете реализовать свой собственный сервис, работающий с CURL через консоль. Это позволит вам передать любые варианты скручивания. Это из-за завитка по умолчанию библиотека.

Comments

    Ничего не найдено.