假设我在Web服务器中运行了一些PHP代码,例如,运行一个简单的Cake程序.从这个应用程序,我想偶尔建立一个TLS连接到一些服务器来交换一些数据.这通常是怎么做的? (我对PHP的经验不多.)
建议使用哪些PHP插件或库或其他方法来完成TLS连接?哪些地方可以开始寻找? (我最初的谷歌搜索给了我很大比例的噪音信号.)
将X509私钥放在Web服务器上涉及哪些安全问题?要建立TLS连接,我将需要X509证书和相应的私钥,可能需要PEM文件,或DER文件,或Java密钥库,或其他任何东西.这个私钥是否会位于Web根目录下易受攻击的位置?这通常如何处理?有什么安全问题,特别是保护用于建立TLS连接的私钥的安全问题?什么是最佳做法?
编辑:我忘了提到程序连接的服务器需要提供客户端证书.客户端确实需要私钥才能连接.此外,我连接的服务器不是HTTP服务器 – 我只需要在与服务器的普通套接字连接上读取/写入(通过SSL / TLS连接).
解决方法
TLS是正确的名称,但大多数人仍将其称为SSL.在PHP中,您可以建立此连接
using CURL.
使用TLS / SSL客户端,您只需要公钥即可验证远程主机.这个公钥只是那个公共密钥,它是否泄露给攻击者并不重要.在服务器端,Apache可以访问公钥和私钥.使用普通文件访问权限保护这些密钥.在* nix系统下,这些密钥通常存储在/ etc /中的某个地方,由Apache进程拥有,而chmod 400最好.
客户端最简单的身份验证方法是简单的用户名/密码.您可以使用SSL对客户端和服务器进行身份验证.这将要求您将私钥存储在您的程序可以访问的位置,理想情况下,在具有chmod 400的webroot之外,但您可以轻松地将其重命名为.PHP或将其放在包含拒绝的.htaccess的文件夹中.所有.在服务器端,您可以使用these environmental variables验证客户端证书.
如果您只想要TLS连接而不是HTTP.然后你可以通过设置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,'passphrase','pass_to_access_keys'); $socket = stream_socket_client('tls://'.$host.':443',$errno,$errstr,30,STREAM_CLIENT_CONNECT,$context); ?>