我试过了:
$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.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:没有值
答案 0 :(得分:2)
甚至PHP5.5证书在PHP中都有用,但是在PHP5.6发生了变化后,如下所述:http://php.net/manual/en/migration56.openssl.php
现在,所有加密的客户端流都默认启用对等验证。默认情况下,这将使用OpenSSL的默认CA捆绑来验证对等证书。在大多数情况下,不需要进行任何更改来与具有有效SSL证书的服务器进行通信,因为分发服务器通常会将OpenSSL配置为使用已知良好的CA捆绑包。
可以通过设置openssl.cafile
或openssl.capath
配置设置在全局范围内覆盖默认CA捆绑包,也可以使用cafile或capath上下文选项在每个请求的基础上覆盖默认CA捆绑包。
虽然一般不推荐,但可以通过将verify_peer上下文选项设置为FALSE
来禁用请求的对等证书验证,并通过将verify_peer_name
上下文选项设置为禁用对等名称验证FALSE
。
使用 cafile fsockopen
尝试解析连接,如果未配置php.ini,则显示错误0
。您可以尝试两种解决方案:
配置php.ini:
您可以下载https://curl.haxx.se/ca/cacert.pem并配置php.ini,如下所示:
openssl.cafile= "C:\openssl\cert\cacert.pem"
也许你需要重启Apache / Ngnix
设置执行时间:
可以设置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()
调用之前。这很可能是由于初始化套接字时出现问题。