如何在Web服务器中安全地从PHP进行TLS连接

Jim*_*ood 4 php security encryption https cryptography

假设我在Web服务器中运行了一些PHP代码,例如,运行一个简单的CakePHP应用程序.从这个应用程序,我想偶尔与一些服务器建立TLS连接以交换一些数据.这通常是怎么做的?(我对PHP没什么经​​验.)

建议使用哪些PHP插件或库或其他方法来完成TLS连接?哪些地方可以开始寻找?(我最初的谷歌搜索给了我很大比例的噪音信号.)

将X509私钥放在Web服务器上涉及哪些安全问题?要建立TLS连接,我将需要X509证书和相应的私钥,可能需要PEM文件,或DER文件,或Java密钥库,或其他任何东西.这个私钥是否会位于Web根目录下易受攻击的位置?这通常如何处理?有哪些安全问题,特别是保护用于建立TLS连接的私钥的安全问题?什么是最佳做法?

编辑:我忘了提到PHP应用程序连接的服务器需要提供客户端证书.客户端确实需要私钥才能连接.此外,我连接的服务器不是 HTTP服务器 - 我只需要在与服务器的普通套接字连接上读取/写入(通过SSL/TLS连接).

roo*_*ook 9

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); 
?>
Run Code Online (Sandbox Code Playgroud)