我正在尝试使用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)
你知道我做错了什么吗?
谢谢!
答案 0 :(得分:1)
请紧记-如果您自己在本地创建ssl证书,则通常不被客户端(例如webbrowser)信任
按照证书创建过程进行操作时,系统会询问您有关通用名称(CN)的信息。那应该是您计划在其上提供网页的域,或者,当您仅在本地使用它时,它也可以是本地主机。
在您的情况下,您使用了与Apache配置中的ServerName
或ServerAlias
不匹配的差异。
自动取款机我不明白为什么您要通过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);
但是仅对本地连接执行(!)