SSL无法在Windows上的PHP5.6中运行

时间:2016-09-25 14:06:20

标签: 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';
}

$host = 'ssl://fbcdn-sphotos-c-a.akamaihd.net:443';

$fp = stream_socket_client($host, $errno, $errstr, 30);

if (!$fp) {
    var_dump($errno, $errstr);
} else {
    echo 'Connected';
}

但两人都回归:

int(0)
string(0) ""

好像我无法连接。

  • 我尝试使用PHP5.6 for x86和PHP5.6 for x64
  • 我在http://windows.php.net/download#php-5.6
  • 中使用了lastet release
  • 在Linux中它似乎正常工作。
  • 仅在某些字段中出现,其他字段效果良好。
  • 使用CURL和SSL的PHP​​在PHP5.6中运行良好

注意:奇怪的是在php5.4中效果很好。

此版本的PHP是否有错误?

详细说明:

PHP 5.4.12

  

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

     

编译器:MSVC9(Visual C ++ 2008)

     

架构:x64

     

配置命令(编译):

cscript /nologo configure.js "--enable-embed" "--enable-cli-win32" "--enable-apache2-2handler" "--enable-apache2-2filter" "--enable-apache2-4handler" "--with-mysql=shared" "--with-mysqli=shared" "--enable-pdo" "--with-pdo-mysql=shared" "--with-pgsql=shared" "--with-pdo-pgsql=shared" "--with-mcrypt=static" "--with-openssl=shared" "--enable-sockets=shared" "--enable-intl=shared" "--enable-mbstring=shared" "--enable-mbregex" "--enable-exif=shared" "--with-xmlrpc=shared" "--with-xsl=shared" "--enable-solr=shared" "--enable-solr-debug" "--with-curl=shared" "--with-tidy=shared" "--with-bz2=shared" "--enable-rar=shared" "--enable-fileinfo=shared" "--with-gettext=shared" "--with-mhash" "--with-ldap=shared" "--enable-com-dotnet=shared" "--enable-soap=shared" "--enable-shmop=shared" "--with-gmp=shared" "--with-interbase=shared" "--with-pdo-firebird=shared" "--with-sqlite3=shared" "--with-pdo-sqlite=shared" "--with-pdo-odbc=shared" "--enable-dbase=shared" "--with-pdo-oci=C:\php-sdk\oracle\x64\instantclient_10_2\sdk,shared" "--with-oci8=C:\php-sdk\oracle\x64\instantclient_10_2\sdk,shared" "--with-oci8-11g=C:\php-sdk\oracle\x64\instantclient_11_2\sdk,shared" "--with-sybase-ct=shared" "--enable-couchdb=shared" "--with-couchbase=shared" "--enable-mongo=shared" "--with-imap=shared" "--enable-mailparse=shared" "--enable-pop3=shared" "--with-smtp=shared" "--with-oauth=shared" "--with-ssh2=shared" "--with-snmp=shared" "--enable-uploadprogress=shared" "--enable-http=shared" "--with-imagick=shared" "--enable-discount=shared" "--with-pdflib=shared" "--with-haru=shared" "--with-excel=shared" "--with-enchant=shared" "--enable-printer=shared" "--with-geoip=shared" "--enable-timezonedb=shared" "--with-xdebug=shared" "--enable-suhosin=shared" "--disable-optimizer-plus" "--enable-pthreads=shared" "--enable-pthreads=shared" "--enable-win32service=shared" "--with-memcached=shared" "--enable-memcache=shared" "--enable-apc=shared" "--enable-apc-srwlock-native" "--enable-apc-debug" "--enable-xcache=shared" "--enable-xcache-optimizer" "--enable-xcache-coverager" "--enable-eaccelerator=shared" "--enable-varnish=shared" "--enable-ffmpeg=shared" "--disable-security-flags"
     

openssl

     

OpenSSL支持:启用

     

OpenSSL Library Version: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

     

编译器:MSVC11(Visual C ++ 2012)

     

架构:x64

     

配置命令(编译):

cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\oracle\x64\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\oracle\x64\instantclient_12_1\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"
     

openssl

     

OpenSSL支持:启用

     

OpenSSL Library Version: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:没有值

2 个答案:

答案 0 :(得分:2)

甚至PHP5.5证书在PHP中都有用,但是在PHP5.6发生了变化后,如下所述:http://php.net/manual/en/migration56.openssl.php

现在,所有加密的客户端流都默认启用对等验证。默认情况下,这将使用OpenSSL的默认CA捆绑来验证对等证书。在大多数情况下,不需要进行任何更改来与具有有效SSL证书的服务器进行通信,因为分发服务器通常会将OpenSSL配置为使用已知良好的CA捆绑包。

可以通过设置openssl.cafileopenssl.capath配置设置在全局范围内覆盖默认CA捆绑包,也可以使用cafile或capath上下文选项在每个请求的基础上覆盖默认CA捆绑包。

虽然一般不推荐,但可以通过将verify_peer上下文选项设置为FALSE来禁用请求的对等证书验证,并通过将verify_peer_name上下文选项设置为禁用对等名称验证FALSE

使用 cafile fsockopen尝试解析连接,如果未配置php.ini,则显示错误0。您可以尝试两种解决方案:

  1. 配置php.ini:

    您可以下载https://curl.haxx.se/ca/cacert.pem并配置php.ini,如下所示:

    openssl.cafile= "‪C:\openssl\cert\cacert.pem"
    
      

    也许你需要重启Apache / Ngnix

  2. 设置执行时间:

    可以设置fsockopen,但您可以使用fopen + stream_context_create,或使用stream_socket_client

      

    注意:有时服务器会阻止访问URL的fopen和file_get_contents之类的功能

    示例:

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

答案 1 :(得分:0)

http://php.net/stream_socket_client

  

如果errno中返回的值为0且函数返回FALSE,则表示错误发生在[系统级] connect()调用之前。这很可能是由于初始化套接字时出现问题。