Как сделать соединение TLS с PHP на веб-сервере и безопасно

Предположим, что у меня есть некоторый PHP-код, запущенный внутри веб-сервера, например, запуск простого приложения CakePHP. Из этого приложения я хочу иногда подключать TLS к некоторому серверу для обмена некоторыми данными. Как это обычно делается? (У меня мало опыта работы с PHP.)

Какие плагины или библиотеки PHP или что-то еще рекомендуется для выполнения TLS-соединений? Где можно найти хорошие места? (Мои первоначальные поисковые запросы Google дают мне огромное отношение шума к сигналу.)

Каковы проблемы с безопасностью, связанные с наличием закрытого ключа X509 на веб-сервере? Чтобы сделать TLS-соединение, мне понадобится как сертификат X509, так и соответствующий закрытый ключ, возможно, файлы PEM или файлы DER, или хранилище ключей Java, или что-то еще. Этот секретный ключ будет сидеть где-то уязвимым под корнем веб-сайта? Как это обычно обрабатывается? Каковы проблемы безопасности, в частности, защиты секретного ключа, который должен использоваться для создания TLS-соединения? Каковы наилучшие методы?

Изменить: я забыл упомянуть, что сервер, к которому подключается приложение PHP, требует наличия сертификата клиента. Клиенту нужен закрытый ключ для подключения. Кроме того, сервер, к которому я подключаюсь, не является HTTP-сервером – мне просто нужно читать / писать на простом сокетном соединении с сервером (через соединение SSL / TLS).

TLS – это правильное имя, однако большинство людей по-прежнему называют его SSL. В PHP вы можете установить это соединение с помощью CURL .

С клиентом TLS / SSL вам нужен только открытый ключ для проверки удаленного хоста. Этот открытый ключ является просто публичным, неважно, попадет ли он в злоумышленник. На серверной стороне Apache имеет доступ как к публичному, так и к закрытому ключу. Эти ключи защищены обычными правами доступа к файлу. В системах * nix эти ключи обычно хранятся где-то в /etc/ , принадлежащем процессу Apache, и лучше всего chmod 400 .

Самый простой способ аутентификации для клиентов – это простое имя пользователя / пароль. Вы можете использовать SSL для аутентификации как клиента, так и сервера. Это потребует от вас хранить секретный ключ где-нибудь, где ваше приложение PHP имеет доступ, в идеале за пределами webroot с chmod 400 , но вы можете легко переименовать его в .php или поместить в папку с .htaccess, которая содержит deny from all . На стороне сервера вы можете проверить сертификат клиентов, используя эти переменные среды .

Если вы просто хотите подключиться к TLS, а не HTTP. Затем вы можете использовать stream_context_set_option, установив параметры контекста :

 <?php $context = stream_context_create(); $result = stream_context_set_option($context, 'ssl', 'local_cert', '/path/to/keys.pem'); // This line is needed if your cert has a passphrase $result = stream_context_set_option($context, 'ssl', 'passphrase', 'pass_to_access_keys'); $socket = stream_socket_client('tls://'.$host.':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context); ?>