首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL在Windows的PHP5.6中不起作用

SSL在Windows的PHP5.6中不起作用
EN

Stack Overflow用户
提问于 2016-09-25 14:06:20
回答 2查看 5K关注 0票数 1

我试过:

代码语言:javascript
复制
$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';
}

和:

代码语言:javascript
复制
$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';
}

但这两项回报:

代码语言:javascript
复制
int(0)
string(0) ""

好像我还没能联系上。

  • 我尝试了x86的PHP5.6和x64的PHP5.6
  • 我在http://windows.php.net/download#php-5.6中使用了lastet版本
  • 在Linux中,它似乎正常工作。
  • 这种情况只发生在某些字段中,而其他字段则工作得很好。
  • 带有CURL和SSL的PHP在PHP5.6中工作得很好

注意:在php5.4中,奇怪地工作得很完美。

这个版本的PHP中有bug吗?

详细信息:

PHP 5.4.12

注册流套接字传输: tcp、udp、ssl、sslv3、sslv2、tls 编译器: MSVC9 (Visual C++ 2008) 体系结构: x64 配置命令(编译): cscript /nologo configure.js --启用-嵌入“-gettext=shared“-with-m散列"--with-ldap=shared”-启用-com-dotnet=shared“--启用-soap=shared”-启用-shmop=shared“-with-gmp=shared”-with-interbase=shared“-with-pdo-firebird=shared”-with-sqlite 3=shared“-with--gettext=shared-odbc=shared”-pdo-odbc=shared“-with oci=C:\php-sdk\oracle\x64\instantclient_10_2\sdk,共享“"--with-oci8=C:\php-sdk\oracle\x64\instantclient_10_2\sdk,共享”"--with-oci8-11g=C:\php-sdk\oracle\x64\instantclient_11_2\sdk,共享““-”-启用 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 编译器: MSVC11 (Visual C++ 2012) 体系结构: x64 配置命令(编译): cscript "--with-pdo-oci=c:\php-sdk\oracle\x64\instantclient_12_1\sdk,/nologo configure.js??启用-快照-构建“”??禁用-isapi“”??启用-调试-包“共享“--启用-对象-out-dir=./obj/”--启用-com-dotnet=共享“-with-mcrypt=静态” 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:无值

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-02 01:16:10

即使PHP5.5证书在PHP中也以某种方式工作,但在PHP 5.6之后,这一点已经改变了,如以下所述:http://php.net/manual/en/migration56.openssl.php

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

默认的CA包可以通过设置openssl.cafileopenssl.capath配置设置在全局基础上重写,也可以通过使用cafile或capath上下文选项根据每个请求重写。

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

fsockopen尝试使用cafile解析连接,如果没有配置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。 注意:有时服务器会阻塞访问urls的fopen和file_get_contents等功能。

示例:

如果您决定出于任何原因需要禁用检查,只需这样做:

票数 7
EN

Stack Overflow用户

发布于 2016-09-25 14:10:25

client

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39687720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档