Flutter web,向具有自签名证书的服务器发出请求时出现问题



我正面临Flutter Web的第一个大问题。

我必须通过对具有自签名ssl证书的服务器的后调用使用oauth2登录。

使用http和dio客户端发出请求,我收到net::ERR_CERT_AUTHORITY_INVALID。我在网上找到的唯一方法是使用HttpClient,它适用于android和IOs,但dart:io在网络构建中不起作用。有没有一种方法可以信任我的用于flutter web的ssl证书??

// My simple line of code
var response = await client.post(authorizationEndpoint.toString(), body: body, headers: headers);
// What I am looking for 
var response = await client.post(authorizationEndpoint.toString(), 
body: body, headers: headers, 
--->    trustanyCA: true);

在web版本中无法做到这一点。浏览器的XMLHttpRequest不允许绕过不受信任的证书,尽管可以对其他http客户端这样做。

如果仅用于调试,您可以尝试将SSL证书添加到系统的受信任证书中(对于macOS,请将其放到钥匙链访问中的系统证书(,并覆盖浏览器的安全选项。请参阅此问题,了解如何在Chrome中覆盖它。

对于生产使用,您仍然需要一个受信任的有效证书。

您可以使用https://pub.dev/packages/universal_io包裹除了Android和iOS之外,它还支持网络。

dependencies:
universal_io: ^1.0.1

执行以下导入而不是dart:io:

import 'package:universal_io/io.dart';

它的工作原理是一样的。

import 'package:universal_io/io.dart';
Future<void> main() async {
final request = HttpClient().getUrl(Uri.parse('https://example.com/path'));
if (request is BrowserHttpClientRequest) {
request.credentialsMode = BrowserHttpClientCredentialsMode.include;
}
final response = await request.close();
// ...
}

编辑:

试试这个,因为它似乎不适用于String,所以尝试使用Bytes方法并遵循证书的路径。

ByteData data = await rootBundle.load('assets/raw/certificate.crt');
SecurityContext context = SecurityContext.defaultContext;
context.setTrustedCertificatesBytes(data.buffer.asUint8List());
client = HttpClient(context: context);

第2版:

如果你使用HttpClient.badCertificateCallback怎么办
这里有一个接受任何证书的代码:

_client = new HttpClient();
_client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;

第3版:

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

如果您使用自签名证书进行开发和测试,您可以将操作系统设置为始终信任证书,浏览器会尊重这一点。

或者,您可以使用Let's Encrypt生成有效证书,然后让本地web服务器使用该证书。

最后,如果您想要一个快速简单的解决方案,ngrok将为您提供一个到localhost的安全隧道,您可以使用它进行开发和测试。

此外,如果您正在使用googlechrome,那么转到本地主机站点设置并将不安全的内容从blocked更改为allow可能会有所帮助。

相关内容

  • 没有找到相关文章

最新更新