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

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

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

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

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

5

Решение

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

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

2

Другие решения

Наконец, эта функция была реализована в 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!!");
// ...

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

локон https://example.com —pinnedpubkey «YourPinsHere !!»

4

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

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

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

3
По вопросам рекламы [email protected]