我正在使用 flutter 通过 https 连接 java java 服务器实现。我首先测试它仅使用 http 即可正常工作。
然后我在服务器端切换到 https,并将其指向我使用 keytool 创建的自签名证书。
然后我尝试使用 http dart 包连接到它。导致以下异常...
Unhandled Exception: HandshakeException: Handshake error in client (OS Error: E/flutter ( 7370): CERTIFICATE_VERIFY_FAILED: self signed certificate(handshake.cc:354))
我假设我需要将我的客户端设置为信任我的服务器自签名证书。我查看了 API 引用资料,但无法弄清楚如何实现这一点...
我的 flutter app 中的 dart 代码如下...
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}');
}
最佳答案
虽然 Pascal 的答案有效,但它仅适用于 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;
}
}
然后在您的主程序中,将您的类实例化为全局 HttpOverride:
HttpOverrides.global = new DevHttpOverrides();
这应该使所有客户端忽略错误的证书,因此仅在开发中推荐使用。 归功于这个问题:https://github.com/dart-lang/http/issues/458
关于java - 带有自签名证书的 Flutter https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59622087/