Как сделать соединение TLS из PHP на веб-сервере и безопасно - PullRequest
4 голосов
/ 01 июля 2010

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

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

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

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

1 Ответ

9 голосов
/ 01 июля 2010

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); 
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...