Предположим, что у меня есть некоторый 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); ?>