尝试使用fsockopen()连接SSL服务器
我正在从我的本地主机和生产服务器运行下一个脚本,并且我得到了不同的输出。任何人都知道为什么我false从我的本地主机上得到它?
<?php
$host = 'ssl://mail.companyname.org';
$port = 993;
$error = 0;
$errorString = "";
var_dump(fsockopen($host, $port, $error, $errorString, 30));
var_dump($errorString);
var_dump($error);
本地主机输出:
布尔(假)
生产服务器输出:
类型(流)的资源(4)
更新:在评论/回答之后,我修改了代码,现在我在本地主机上得到了这个输出:
PHP 警告:fsockopen():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证在第 7 行 /tmp/test.php 中失败 PHP 警告:fsockopen():无法启用/tmp/test.php 第 7 行 PHP 警告:fsockopen(): 无法连接到 ssl://mail.twmdata.org:993 (Unknown error) in /tmp/test.php 第 7 行 bool(false) ) 字符串(0) "" int(0)
回答
这似乎是服务器证书的问题:
首先,您可以通过以下方式检查您的服务器证书及其链是否有效:
https://www.sslshopper.com/ssl-checker.htm
如果 ssl-checker 出现问题?
-
您可以尝试更正companyname.org 中的SSL 证书配置
如果您成功并且错误仍然存在?
- 您必须手动添加证书文件。
如果您有自签名证书:
- 您必须手动添加证书文件。
如果您没有证书,也不关心中间人攻击,您仍然可以使用没有证书的 SSL。
- 关闭php fsock证书检查(不推荐)
建议至少拥有自签名证书。如果您有自签名的 try 1解决方案。
我发现了问题
您已经在 PHP 警告日志中公开了您的域名,因此我检查了您的域 SSL。
在我使用此工具检查您公司的域证书后:
https://www.sslshopper.com/ssl-checker.html#hostname=twmdata.org
您的证书有 2 个错误:
-
此证书已过期(0 天前)。现在续约。
-
证书中没有一个通用名称与输入的名称 (twmdata.org) 匹配。在 Web 浏览器中访问此站点时,您可能会收到错误消息。
所以看来你必须先更新你的证书
更新:
我发现这个答案可能有帮助
/sf/answers/2867344301/
它建议使用
stream_context_create(['ssl' => [
'ciphers' => 'RC4-MD5'
]])
正如@ChrisHaas 建议连接stream_context_create并stream_socket_client为您带来很多选择,如果您想指定证书目录或您想关闭证书检查。