繁体   English   中英

PHP:未使用 stream_socket_client() 设置 TLS 套接字

[英]PHP: TLS socket not setting up using stream_socket_client()

我正在尝试使用以下代码打开 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 文件可能是问题所在。 我需要把什么文件放在那里?

谢谢!

我该如何解决这个问题?

在你知道问题是什么之前,这将是非常困难的。

显然,使用 stream_socket_client 解决问题不起作用并且没有为您提供任何有用的诊断信息。 您需要分解此调用正在执行的操作并单独测试每个部分。

'xx.xx.xx.xx' 是代表 IP 地址还是主机名? 如果是后者,您可能会遇到分辨率问题。 试试dns_get_record () 如果是前者,你希望如何验证证书的主题?

你可以在端口 8883 上连接吗? 试试fsockopen ()

SSL 有效吗?

  • 你能协商一个密码吗
  • 证书是否有效
  • 是 certs.pem 文件中由 CA 签署的证书

您可以使用openssl s_client从命令行检查这些

更新

从您的编辑: certificate verify failed - 请参阅上面有关 IP 地址和证书验证的说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM