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

时间:2018-02-08 12:14:56

标签: php sockets ssl

我尝试使用此代码打开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文件可能是个问题。我需要放在哪个文件中?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

如何解决此问题?

在您知道问题所在之前,这将会非常困难。

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

&#39; xx.xx.xx.xx&#39;代表IP地址或主机名?如果是后者,您可能会遇到解决问题。试试dns_get_record()如果是前者,您希望如何验证证书的主题?

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

SSL工作吗?

  • 你能谈判一个密码
  • 证书有效吗
  • 是由certs.pem文件中的CA签名的证书

您可以使用openssl s_client

从命令行查看这些内容

<强>更新

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