我尝试使用此代码打开TLS连接:
<?php
$cafile = '/var/www/html/mosquitto/cert.pem';
$socketContext = stream_context_create(["ssl" => [
"verify_peer_name" => true,
"cafile" => $cafile
]]);
$socket = stream_socket_client("tls://xx.xx.xx.xx:8883", $errno, $errstr, 60, STREAM_CLIENT_CONNECT, $socketContext);
if (!$socket) {
print("Error: ".$errstr);
return false;
}else{
print("Connection Opened");
}
?>
Nginx错误日志:
2018/02/08 17:40:28 [error] 1331#1331: *658 FastCGI sent in stderr: "PHP message: PHP Warning: stream_socket_client(): SSL operation $
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /var/www/html/test.php on line 10
PHP message: PHP Warning: stream_socket_client(): Failed to enable crypto in /var/www/html/test.php on line 10
PHP message: PHP Warning: stream_socket_client(): unable to connect to tls://xx.xx.xx.xx:8883 (Unknown error) in /var/www/html/test.$
这总是出现错误部分!$socket
,但没有任何错误字符串。它只是Error:
。我该如何解决这个问题?我猜测cert.pem文件可能是个问题。我需要放在哪个文件中?
谢谢!
答案 0 :(得分:1)
如何解决此问题?
在您知道问题所在之前,这将会非常困难。
使用stream_socket_client清楚地解决问题不起作用并且没有提供任何有用的诊断信息。您需要分解此调用正在进行的操作并单独测试每个部分。
&#39; xx.xx.xx.xx&#39;代表IP地址或主机名?如果是后者,您可能会遇到解决问题。试试dns_get_record()如果是前者,您希望如何验证证书的主题?
您可以在8883端口上连接吗?试试fsockopen()
SSL工作吗?
您可以使用openssl s_client
从命令行查看这些内容<强>更新强>
从您的修改:certificate verify failed
- 请参阅上面有关IP地址和证书验证的说明