我正面临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可能会有所帮助。