SSL在Windows上的PHP5.6中不起作用
我试过:SSL在Windows上的PHP5.6中不起作用,php,windows,ssl,Php,Windows,Ssl,我试过: $host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net'; $port = 443; $fp = fsockopen($host, $port, $errno, $errstr, 30); if (!$fp) { var_dump($errno, $errstr); } else { echo 'Connected'; } 以及: 但两者都有回报: int(0) string(0) "" 好像我没能联系上似的 我在x86上试
$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net';
$port = 443;
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) {
var_dump($errno, $errstr);
} else {
echo 'Connected';
}
以及:
但两者都有回报:
int(0)
string(0) ""
好像我没能联系上似的
- 我在x86上试过PHP5.6,在x64上试过PHP5.6
- 我在中使用了lastet release
- 在Linux中,它似乎工作正常
- 这只发生在某些字段中,其他字段工作正常
- 带有CURL和SSL的PHP在PHP5.6中运行良好
OpenSSL支持:已启用 OpenSSL库版本:OpenSSL 1.0.1c 2012年5月10日 OpenSSL标头版本:OpenSSL 1.0.1e 2013年2月11日 PHP 5.6.26 已注册的流套接字传输:tcp、udp、ssl、sslv3、tls、tlsv1.0、tlsv1.1、tlsv1.2 编译器:MVC11(Visual C++ 2012)< /P> 架构:x64 配置命令(编译): openssl
OpenSSL支持:已启用 OpenSSL库版本:OpenSSL 1.0.1c 2012年5月10日 OpenSSL标头版本:OpenSSL 1.0.1t 2016年5月3日 Openssl默认配置:c:/Openssl-1.0.1c-X64/ssl/Openssl.cnf openssl.cafile:没有值 openssl.capath:没有值 如果
errno
中返回的值为0
,且函数返回FALSE
,则表明错误发生在[system level]connect()调用之前。这很可能是由于初始化套接字时出现问题
如果errno
中返回的值为0
,且函数返回FALSE
,则表明错误发生在[system level]connect()调用之前。这很可能是由于初始化套接字时出现问题
甚至PHP5.5证书在PHP中也能以某种方式工作,但在PHP5.6之后,情况发生了变化,如中所述:
默认情况下,所有加密的客户端流现在都启用对等验证。默认情况下,这将使用OpenSSL的默认CA捆绑包来验证对等证书。在大多数情况下,无需进行任何更改即可与具有有效SSL证书的服务器通信,因为分销商通常会将OpenSSL配置为使用已知良好的CA捆绑包
通过设置openssl.cafile
或openssl.capath
配置设置,或者使用cafile或capath上下文选项,可以在全局基础上覆盖默认CA捆绑包,或者在每个请求基础上覆盖默认CA捆绑包
虽然通常不推荐使用,但可以通过将verify_peer context选项设置为FALSE
来禁用请求的对等证书验证,并通过将verify_peer_name
context选项设置为FALSE
来禁用对等名称验证
fsockopen
尝试使用cafile解析连接,如果未配置php.ini,则显示错误0
。您可以尝试两种解决方案:
配置php.ini:
您可以下载并配置php.ini,如下所示:
openssl.cafile= "C:\openssl\cert\cacert.pem"
也许您需要重新启动Apache/Ngnix
执行时间设置:
可以设置fsockopen
,但您可以使用fopen
+stream\u context\u create
,或使用stream\u socket\u client
注意:有时服务器会阻止访问URL的fopen和file_get_内容等功能
例如:
<?php
$opts = array(
'ssl' => array(
'verify_peer' => true,
'cafile' => 'C:/openssl/cert/cacert.pem',
'verify_depth' => 5,
'CN_match' => 'fbcdn-sphotos-c-a.akamaihd.net'
)
);
$context = stream_context_create($opts);
$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net:443';
$fp = stream_socket_client($host, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
var_dump($errno, $errstr);
} else {
echo 'Connected';
}
即使PHP5.5证书在PHP中也能以某种方式工作,但在PHP5.6之后,它已经发生了变化,如中所述:
默认情况下,所有加密的客户端流现在都启用对等验证。默认情况下,这将使用OpenSSL的默认CA捆绑包来验证对等证书。在大多数情况下,无需进行任何更改即可与具有有效SSL证书的服务器通信,因为分销商通常会将OpenSSL配置为使用已知良好的CA捆绑包
通过设置openssl.cafile
或openssl.capath
配置设置,或者使用cafile或capath上下文选项,可以在全局基础上覆盖默认CA捆绑包,或者在每个请求基础上覆盖默认CA捆绑包
虽然通常不推荐使用,但可以通过将verify_peer context选项设置为FALSE
来禁用请求的对等证书验证,并通过将verify_peer_name
context选项设置为FALSE
来禁用对等名称验证
fsockopen
尝试使用cafile解析连接,如果未配置php.ini,则显示错误0
。您可以尝试两种解决方案:
配置php.ini:
您可以下载并配置php.ini,如下所示:
openssl.cafile= "C:\openssl\cert\cacert.pem"
也许您需要重新启动Apache/Ngnix
执行时间设置:
可以设置fsockopen
,但您可以使用fopen
+stream\u context\u create
,或使用stream\u socket\u client
注意:有时服务器会阻止访问URL的fopen和file_get_内容等功能
例如:
<?php
$opts = array(
'ssl' => array(
'verify_peer' => true,
'cafile' => 'C:/openssl/cert/cacert.pem',
'verify_depth' => 5,
'CN_match' => 'fbcdn-sphotos-c-a.akamaihd.net'
)
);
$context = stream_context_create($opts);
$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net:443';
$fp = stream_socket_client($host, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
var_dump($errno, $errstr);
} else {
echo 'Connected';
}
您是否在所有这些版本的php中都启用了php\u openssl
扩展,它可能不是由default@RiggsFolly是的,就像我说的,只有一些URL失败,其他SSL域工作正常。@RiggsFolly我用phpinfo的详细信息更新了问题您是否在所有这些版本的php中都启用了php\u openssl
扩展,可能不是由default@RiggsFolly是的,就像我说的,只有一些URL失败,其他SSL域工作正常。@RiggsFolly我用来自的详细信息更新问题phpinfo@GuilhermeNascimento我会检查两个安装上的phpinfo()
的输出,以确认这一点。@G
<?php
$opts = array(
'ssl' => array(
'verify_peer' => true,
'cafile' => 'C:/openssl/cert/cacert.pem',
'verify_depth' => 5,
'CN_match' => 'fbcdn-sphotos-c-a.akamaihd.net'
)
);
$context = stream_context_create($opts);
$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net:443';
$fp = stream_socket_client($host, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
var_dump($errno, $errstr);
} else {
echo 'Connected';
}
<?php
$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net';
$port = '443';
$opts = array(
'ssl' => array(
'verify_peer' => false
)
);
$context = stream_context_create($opts);
$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net:443';
$fp = stream_socket_client($host, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
var_dump($errno, $errstr);
} else {
echo 'Connected';
}