gpt4 book ai didi

flutter - CERTIFICATE_VERIFY_FAILED : Hostname mismatch(handshake. cc:352)) 用于本地服务器上的 TCP 连接

转载 作者:行者123 更新时间:2023-12-03 03:01:12 24 4
gpt4 key购买 nike

我的代码正确连接到 AWS-END-POINT,但是当我尝试使用本地网络 ip 连接到 Greengrass 核心时。我收到此错误。

E/flutter (12349): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: HandshakeException: Handshake error in client (OS Error:
E/flutter (12349): CERTIFICATE_VERIFY_FAILED: Hostname mismatch(handshake.cc:352))

我已经检查了 greengrass 核心。它工作正常。它很好地连接到网络客户端。我认为使用 ip 地址而不是 URL 地址可能存在一些问题。但我不确定。有人可以帮忙吗?

我正在运行的代码是:

import 'dart:async';
import 'dart:io';
import 'package:mqtt_client/mqtt_client.dart';
import 'dart:convert' show utf8;
import 'dart:convert';
Future<int> main() async {
const String url =
'192.168.8.106';
const int port = 8883;
const String clientId =
'MY CLIENT ID';
MqttClient client = MqttClient(url,clientId);
client.port = port;
client.secure = true;
final SecurityContext context = new SecurityContext(withTrustedRoots: true);
context.setTrustedCertificatesBytes(utf8.encode(' CERT '));
context.useCertificateChainBytes(utf8.encode(' CERT '));
context.usePrivateKeyBytes(utf8.encode(' PRIVEATE KEY '));
client.securityContext = context;
client.setProtocolV311();
// logging if you wish
client.logging(on: false);
print('Before Connecting');
try{
await client.connect();
}catch(e){
print('CATCH IS : ');
print (e);
}
print('After Connecting');
if (client.connectionStatus.state == MqttConnectionState.connected) {
print('iotcore client connected');
} else {
client.disconnect();
}
print('Sleeping....');
for (int i=1; i>0; i++)
{
const String topic = '\$aws/things/Pi_tmfacility_0_1/shadow/update';
Map<dynamic, dynamic> payload =
{'state': {
'desired': {
'number' : i
}
}
};
final MqttClientPayloadBuilder builder = MqttClientPayloadBuilder();
builder.addString(json.encode(payload));
print('into the publish to get single device shadow ');
client.publishMessage(topic, MqttQos.atMostOnce, builder.payload);
print('Ready to Sleep');
await MqttUtilities.asyncSleep(10);
print('Loop no = $i');
}
print('Disconnecting');
client.disconnect();
return 0;
}

最佳答案

问题是本地机器出示的证书中的 CN(或 SAN)不包括 192.168.8.106

您可以使用 openssl s_client 命令验证这一点:

openssl s_client -connect 192.168.8.106:8883 -CAfile /path/to/ca/cert

这意味着 flutter 中的 SSL/TLS 库会提示证书不能可靠地代表那台机器。

这很重要,因为这是阻止中间人攻击的原因。

你有 2 个选项来解决这个问题。

  1. 使用 192.168.8.106 的 CN 或 SAN 条目重新颁发证书
  2. 看看您能否找到影响证书验证的方法。有一些关于如何使用 dart http 库 ( https://stackoverflow.com/a/59303283/504554 ) 执行此操作的示例,但我没有在 MQTT 客户端库中找到它(我没有那么努力地寻找)。

如果选择选项 2,则必须非常小心,以确保不会为中间人攻击打开太大的漏洞。

关于flutter - CERTIFICATE_VERIFY_FAILED : Hostname mismatch(handshake. cc:352)) 用于本地服务器上的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59318025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com