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

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

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

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

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

3 ответа

Решение

(Сертификационные центры не участвуют.)

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

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

Требования

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

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

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

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

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

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

sha256 // cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2 + soZS7sWs =; sha256 // M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE

Тем не менее, обратите внимание, что между HPKP и CURL есть одна большая разница CURLOPT_PINNEDPUBLICKEY: В HPKP вы можете закрепить открытые ключи промежуточных сертификатов, при использовании 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!!");
// ...

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

curl https://example.com/ --pinnedpubkey "YourPinsHere!!"

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

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

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

Другие вопросы по тегам