SSL的fsockopen错误

时间:2018-06-24 14:41:58

标签: php ssl https wamp

我正在尝试使用Wamp在localhost和Windows上的https上使用localhost上的fsockopen。 在http上工作正常,但在https上却无法正常工作。

我使用OpenSSL(How to install: OpenSSL + WAMP)创建了一个证书,并在httpd-vhosts.conf文件中声明了一个虚拟主机。

这是PHP代码:

import facebook
import requests

ACCESS_TOKEN="xxx"
access_token=ACCESS_TOKEN
user="theuser"

graph=facebook.GraphAPI(access_token)

p= graph.get_connections(id=user, connection_name='insights', fields='period')
print(p)

这会产生以下错误:

$fp = fsockopen("ssl://localhost", 443, $errno, $errstr, FSOCKOPEN_TIMEOUT); // same pb with ssl://www.localhost

当Apache启动时,我的ssl错误日志文件中也有以下警告(我不知道它是否可能相关):

PHP Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
PHP Warning:  fsockopen(): Failed to enable crypto
PHP Warning:  fsockopen(): unable to connect to ssl://localhost:443 (Unknown error)

你知道我做错了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

请紧记-如果您自己在本地创建ssl证书,则通常不被客户端(例如webbrowser)信任

按照证书创建过程进行操作时,系统会询问您有关通用名称(CN)的信息。那应该是您计划在其上提供网页的域,或者,当您仅在本地使用它时,它也可以是本地主机。 在您的情况下,您使用了与Apache配置中的ServerNameServerAlias不匹配的差异。

自动取款机我不明白为什么您要通过ssl连接到本地主机-从安全角度来看,这不是必须的。

否则,您可以强制客户端(php)不检查证书的有效性

<?php
$context = stream_context_create([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false
    ]
]);
$fp = stream_socket_client("ssl://localhost", $errno, $errstr, ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context);

但是仅对本地连接执行(!)