Я в этой очень неудачной ситуации
Мой сайт раньше обменивался данными с платежным шлюзом, но поскольку TLSv1.0 отброшен, я больше не могу использовать библиотеку php cURL или даже file_get_contents()
(или wget / lynx / curl через оболочку)
Есть ли обходной путь, любой вариант, как подключить защищенный сервер TLSv1.1 + без использования встроенных библиотек?
Я знаю, что некоторые классы существуют в PHP, как phpseclib который является SSH клиентом, отлично подходит для людей, которые не могут использовать Модуль SSH2
Существует ли что-то подобное для PHP? Есть ли способ, которым я могу подключиться к своему шлюзу?
Пока что моя лучшая идея — подключиться к шлюзу через другой сервер (с обновленным программным обеспечением).
Однажды я использовал утилиту под названием Stunnel для моего не-TLS клиента, цитата с сайта:
Stunnel — это прокси, разработанный для добавления функциональности шифрования TLS к существующим клиентам и серверам без каких-либо изменений в коде программ. Его архитектура оптимизирована для обеспечения безопасности, переносимости и масштабируемости (включая распределение нагрузки), что делает его пригодным для крупных развертываний.
Есть ли обходной путь, любой вариант, как подключить защищенный сервер TLSv1.1 + без использования встроенных библиотек?
Я могу думать о пяти обходных путях:
1) Возможно (но сложно) установить несколько версий OpenSSL (или даже Curl). Вы даже можете использовать LD_PRELOAD_LIBRARY, чтобы сделать существующую бинарную библиотеку использования из другого места. Я думаю, что это грязный способ сделать это.
2) Это было бы очень просто с Docker. К сожалению, для этого требуется современное ядро, поэтому вы, вероятно, не сможете установить его на свой сервер. Но вы можете установить более современную ОС, а затем установить сервер в Docker-контейнер со старой ОС. Но это может быть примерно такая же работа, как перевод вашего сайта на новую ОС.
3) Вместо Docker просто используйте chroot
, В новом окне используйте «ldd», чтобы найти все зависимости. Скопируйте их (плюс завиток) в chroot. Скопируйте этот каталог на ваш сервер и запустите «chrooot dir curl». Двоичный файл увидит новые библиотеки и будет работать. Это займет всего несколько минут, чтобы настроить для кого-то, кто знает, что они делают.
4) Используйте статически связанную версию curl, в которой скомпилирован более новый OpenSSL.
5) Используйте программу, которая не использует OpenSSL. Например, некоторые программы go (lang) используют свое собственное шифрование и компилируют в статический двоичный файл. Например: https://github.com/astaxie/bat
Первые 2 могут быть немного непрактичными в вашей настройке, но любой из последних 3 будет работать.
Мне понравилась ваша первоначальная идея прокси-сервера на другой сервер, за исключением того, что вы обходите ограничения безопасности, наложенные шлюзом, и при работе с информацией об оплате это, вероятно, не идея.
Однако, если вы можете запустить экземпляр Vagrant на своем собственном сервере с обновленными библиотеками, то вы можете передать незащищенный запрос на экземпляр Vagrant на локальном хосте, и он не покидает поле, тогда из экземпляра Vagrant, который обновил библиотеки, безопасная связь с вашим шлюзом.
Я собирался предложить Stunnel. НО dafyc хорошо отмечен.
Эти ограничения PCI не реализованы, чтобы замедлить людей (только .. смеется). Они существуют для защиты.
Вы решите свою проблему с Stunnel.
Но почему бы не обновить сервер сайта?
Вы определили устаревший SSL, но как сервер будут доступны и другие ошибки.
Если они исследуют какую-то другую слабость и получат доступ с правами root, у них будет пароль от stunnel, чтобы начать исследовать, что находится в канале.
Так что это не кажется достаточно хорошим, чтобы гарантировать надежность, которую PCI хочет, чтобы вы имели.
Я уже опубликовал один ответ, но потом я прочитал в комментариях, что вы не можете установить какие-либо инструменты на сервер. Вы можете использовать собственные функции PHP, называемые Потоки PHP. Это пример кода для старого Twitter API:
$url = 'https://api.twitter.com/1/statuses/public_timeline.json';
$contextOptions = array(
'ssl' => array(
'verify_peer' => true,
'cafile' => '/etc/ssl/certs/ca-certificates.crt',
'verify_depth' => 5,
'CN_match' => 'api.twitter.com',
'disable_compression' => true,
'SNI_enabled' => true,
'ciphers' => 'ALL!EXPORT!EXPORT40!EXPORT56!aNULL!LOW!RC4'
)
);
$sslContext = stream_context_create($contextOptions);
$result = file_get_contents($url, NULL, $sslContext);
Я нашел другое решение.
На защищенном сервере я установил два VirtualHosts — 443 для TLSv1.2 и еще один для моего сайта только с поддержкой TLSv1.0
Больше информации здесь: https://serverfault.com/a/692894/122489
Спасибо за все ответы.