Я хотел бы установить связь между двумя приложениями, защищенными с помощью TLS 1.2, в которых закреплены открытые ключи конечных точек. (Сертификационные центры не участвуют.)
Кроме того, я даже не хочу иметь дело с сертификатами; просто открытые ключи RSA / ECDSA.
В частности, они оба являются PHP-приложениями, и я использую curl для облегчения общения.
Кто-нибудь достиг этого раньше?
(Сертификационные центры не участвуют.)
По умолчанию curl настроен так, чтобы не доверять каким-либо CA. Вот и все.
И, не вдаваясь в подробности или отклики, основанные на мнениях, вот хорошо организованная «шпаргалка», которая может вам чем-то помочь: https://www.owasp.org/index.php/Pinning_Cheat_Sheet (щедрость не нужна <3)
Наконец, эта функция была реализована в PHP, и вы также можете использовать ее в старых версиях PHP, если вашей версии cURL достаточно!
Вы можете использовать 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
// 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 !!»
Я не знал решения, но могу предложить вам несколько способов узнать:
Взгляни на http://php.net/manual/en/function.curl-setopt.php
Особенно в варианте CURLOPT_SSH_HOST_PUBLIC_KEY_MD5. Это не позволяет проверить полный открытый ключ, только его хэш md5.
В качестве другого варианта вы можете реализовать свой собственный сервис, работающий с CURL через консоль. Это позволит вам передать любые варианты скручивания. Это из библиотеки по умолчанию curl.