php 5.6 update stream_socket_client - 不再打开socket

时间:2015-02-05 12:17:51

标签: php php-5.6

$certFile = 'ful_path/yourcert.pem';

$context = stream_context_create();

$result = stream_context_set_option($context, 'ssl', 'local_cert',
$certFile);

$result = stream_context_set_option($context, 'ssl', 'verify_peer',
false);

$result = stream_context_set_option($context, 'ssl', 'verify_host',
false);

$result = stream_context_set_option($context, 'ssl',
'allow_self_signed', true);


$sock = stream_socket_client('tls://www.somewhere.com:9999',
$errno,$errstr, 30, STREAM_CLIENT_CONNECT, $context);

已添加:www.somewhere.com ca to server certs 已删除& $ 已检查yourcert.pem到期日 如果没有将整个代码迁移到卷曲,我就会陷入困境。它必须像我脸上的鼻子那样明显......但是... ...

1 个答案:

答案 0 :(得分:2)

首先,让我这样说:

  

PHP5.6默认使用您的操作系统管理的CA证书存储。除非您连接到公开自签名证书的DNS名称,否则您可能根本不需要SSL上下文。

在您执行任何其他操作之前,请尝试在没有任何ssl上下文的情况下进行连接。如果远程站点的证书有效并且由任何标准证书颁发机构签名,那么它应该只是工作"在PHP 5.6中自动化。

那说......你的代码片段中有几个非常值得怀疑的东西。如果不了解更多关于你要做的事情,我们真的不可能知道哪个是真正的问题,所以我只是迭代所有这些。

$result = stream_context_set_option($context, 'ssl', 'local_cert',
$certFile);

^您是否连接到需要以提供远程服务器验证的证书的站点?如果不是(这几乎肯定是这种情况),您不应该指定"local_cert"选项。

$result = stream_context_set_option($context, 'ssl', 'verify_peer',
false);

^这是一个可怕的想法,因为它让你暴露于中间人攻击。你应该从不这样做,除非你在一次性场景中测试一些东西。不要这样做。

$result = stream_context_set_option($context, 'ssl', 'verify_host',
false);

^这甚至不是一件事。 PHP中没有"verify_host"选项。

$result = stream_context_set_option($context, 'ssl',
'allow_self_signed', true);

所以...总而言之,根据您提供的信息,没有好办法回答这个问题。但我已经指出了明显的问题......