ssl Flutter应用程序无法进行套接字连接,证书握手错误CERTIFICATE_VERIFY_FAILURE

fiei3ece  于 2023-10-19  发布在  Flutter
关注(0)|答案(2)|浏览(113)

有人可能会说这个问题是重复的,但它不是,因为其他这种类型的问题是关于自签名证书和开发环境的。
我有来自www.example.com的有效证书letsencrypt.org,但我无法建立套接字连接。我有一个nodejs服务器,在那里我使用模块“ws”,并使用flutter中的包“web_socket_channel”。
我对所有的http请求都有同样的握手问题(使用requests包),但我可以通过添加选项verify为false来绕过它:

final r = await Requests.get(app_url, verify: false);

我不喜欢这个解决方案,因为它对生产环境不安全。我想要一个适合生产环境的解决方案。
谢谢你们

093gszye

093gszye1#

对于每一个阅读这一点,问题不是从我的Flutter代码,它是从我的nginx配置,我必须添加以下行到/etc/nginx/conf.d/sysmon.conf文件:

location / {
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";
        proxy_set_header    Host $http_host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass         http://<SERVER_IP>:<PORT>;
    }
g6ll5ycj

g6ll5ycj2#

您可以扩展HttpOverides类并重写HttpClient方法来更改securityContext。这主要发生在Android 7及以下的用户身上。

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
   }
  }

并在主目录中声明

Future<void> main() async {
  HttpOverrides.global = MyHttpOverrides();
 runApp(const MyApp());
}

如果你在后台服务中运行WebSocket通道,当WebSocket断开连接时,你需要定期重新连接到服务器,确保你在你的start方法中添加HttpOverrides.global = MyHttpOverrides();,如果你像这样使用flutter_background_service包,

@pragma('vm:entry-point')
Future<void> onStart(ServiceInstance service) async {
  HttpOverrides.global = MyHttpOverrides();
// Your Websocket connection code goes here
}

相关问题