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中运行良好
注意:奇怪的是,在php5.4中工作得非常完美

这个版本的PHP中有bug吗

细节: PHP 5.4.12

已注册的流套接字传输:tcp、udp、ssl、sslv3、sslv2、tls

编译器:MVC9(Visual C++ 2008)< /P> 架构:x64

配置命令(编译):

openssl

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';
    }