假设我有一些 PHP 代码在 Web 服务器中运行,例如,运行一个简单的 CakePHP 应用程序。从这个应用程序,我想偶尔与某些服务器建立 TLS 连接以交换一些数据。这通常是如何完成的? (我对 PHP 没有什么经验。)
建议使用哪些 PHP 插件或库或其他任何东西来完成 TLS 连接?从哪里开始寻找一些好的地方? (我最初的 Google 搜索给了我一个巨大的噪声信号比。)
将 X509 私钥放在网络服务器上会涉及哪些安全问题?要建立 TLS 连接,我将需要 X509 证书和相应的私钥,可能是 PEM 文件或 DER 文件,或者在 Java keystore 中,等等。该私钥是否会位于网络根目录下易受攻击的地方?这通常是如何处理的?安全问题是什么,特别是保护用于建立 TLS 连接的私钥?最佳做法是什么?
编辑:我忘了提及 PHP 应用程序连接到的服务器需要提供客户端证书。客户端确实需要私钥才能连接。另外,我连接的服务器不是 HTTP 服务器——我只需要在与服务器的普通套接字连接上读/写(通过 SSL/TLS 连接)。
最佳答案
TLS 是正确的名称,但大多数人仍将其称为 SSL。在 PHP 中,您可以建立此连接 using CURL .
使用 TLS/SSL 客户端,您只需要公钥即可验证远程主机。这个公钥就是那个公钥,它是否泄露给攻击者并不重要。在服务器端,Apache 可以访问公钥和私钥。这些 key 使用普通文件访问权限进行保护。在 *nix 系统下,这些 key 通常存储在 /etc/
中,由 Apache 进程拥有,chmod 400
最好。
客户端最简单的身份验证方法是简单的用户名/密码。您可以使用 SSL 对客户端和服务器进行身份验证。这将要求您将私钥存储在您的 PHP 应用程序可以访问的地方,最好是在 webroot 之外,使用 chmod 400
,但您可以轻松地将其重命名为 .php 或将其放在一个文件夹中包含 deny from all
的 .htaccess。在服务器端,您可以使用 these environmental variables 验证客户端证书.
如果您只想要 TLS 连接而不是 HTTPs。然后你可以通过设置 Context Options 来使用 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);
?>
关于php - 如何在 Web 服务器中安全地从 PHP 建立 TLS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153206/