Java 带自签名证书的flatter https
我正在使用flatter通过https连接java服务器实现。我首先用http测试了它是否正常工作 然后我切换到服务器端的https,并将其指向我使用keytool创建的自签名证书 然后我尝试使用http dart包连接到它。错误导致了以下异常 未处理的异常:握手异常:客户端(OS)中的握手错误 错误:E/flatter(7370):证书验证失败:自签名 证书(握手,抄送:354)) 我假设我需要将客户端设置为信任我的服务器自签名证书。我已经看过APi参考资料,但不知道如何实现这一点 我的飞镖应用程序中的飞镖代码如下Java 带自签名证书的flatter https,java,ssl,flutter,dart,https,Java,Ssl,Flutter,Dart,Https,我正在使用flatter通过https连接java服务器实现。我首先用http测试了它是否正常工作 然后我切换到服务器端的https,并将其指向我使用keytool创建的自签名证书 然后我尝试使用http dart包连接到它。错误导致了以下异常 未处理的异常:握手异常:客户端(OS)中的握手错误 错误:E/flatter(7370):证书验证失败:自签名 证书(握手,抄送:354)) 我假设我需要将客户端设置为信任我的服务器自签名证书。我已经看过APi参考资料,但不知道如何实现这一点 我的飞镖应
void testMessage() {
var url = 'https://192.168.100.105:8443';
var response = await http.post(url, body: "{\"message_name\": \"TestMessage\", \"contents\": { \"field1\":\"blah\", \"field2\":\"blah\" }}");
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
}
在开发过程中,您可以使用HttpClient的
badCertificateCallback
回调,只需返回true
。这将接受所有坏证书
HttpClient=HttpClient()
…badCertificateCallback=((X509CertificateCert,字符串主机,int端口)=>true);
要接受特定的坏证书,您可以从以下位置尝试此代码:
导入'dart:io';
将“package:http/http.dart”导入为http;
bool_certificateCheck(X509Certificate cert,字符串主机,int端口)=>
主机=='local.domain.ext';// 如果您使用dio库,您可以在Pascal的答案有效时从http向https发出请求,它只适用于dart:io HttpClient
。
要将badCertificateCallback
应用于http
包的Client
实例,请执行以下操作:
创建一个类,该类通过以下方式重写HttpOverrides
:
class DevHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
return super.createHttpClient(context)
..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
}
}
然后在main中,将类实例化为全局HttpOverride:
HttpOverrides.global = new DevHttpOverrides();
这将使所有客户机忽略坏证书,因此是唯一的;在开发中推荐了y。
值得赞扬的是这个问题:这段代码将如何在他的代码中实现?我有一个类似的问题,我希望继续使用http包,而不是dart/io,因为我发现实现更容易阅读、更简单、更简短。请不要只是发布一些工具或库作为答案。至少在答案中说明一下。使用它并没有解决问题的特殊方法,@Yunnosch,仅仅使用这个库就不会有问题。在决定使用哪个库之前,这对我来说是很有帮助的,所以我把它作为一个答案,以防它对其他人有帮助