php - 如何在 Web 服务器中安全地从 PHP 建立 TLS 连接

标签 php security encryption https cryptography

假设我有一些 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/

相关文章:

php - 将天数转换为相对于 php 中的天数的周数

php - 使用 PHP 更新多个字段 (MySQL)

python - 使用 Mercurial 克隆时 SSL 包装器出错

windows - 如何使用不同的IIS用户读取加密的目录文件

javascript - 使用 php mysqli 插入 json 数组时出错

php - Codeigniter 子查询

ios - 将 Pin 码(字符串)值保存到 iOS Keychain 是否足够安全?

ios - iOS 应用程序构建 : The binary may contain the following banned API(s) _memcpy, _alloca、_gets 中的安全问题

c# - 通过社会安全号码安全地存储和搜索

java - AES 解密的有效结果在一个字节和一个字节中不同的可能性有多大?