Sco*_*ttF 4 java ssl https dart flutter
我正在使用flutter通过https连接java java服务器实现。我首先测试它是否仅使用 http 即可工作。
然后我在服务器端切换到 https 并将其指向我使用 keytool 创建的自签名证书。
然后我尝试使用 http dart 包连接到它。导致以下异常...
未处理的异常:HandshakeException:客户端中的握手错误(操作系统错误:E/flutter(7370):CERTIFICATE_VERIFY_FAILED:自签名证书(handshake.cc:354))
我假设我需要将我的客户端设置为信任我的服务器自签名证书。我查看了 APi 参考资料,但不知道如何实现这一点......
我的颤振应用程序中的 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}');
}
Run Code Online (Sandbox Code Playgroud)
在开发时,您可以使用badCertificateCallbackHttpClient 的回调并返回true。这将接受所有错误的证书。
HttpClient client = HttpClient()
..badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
Run Code Online (Sandbox Code Playgroud)
要接受特定的错误证书,您可以从此处尝试此代码: https: //github.com/dart-lang/http/issues/14#issuecomment-311184690
import 'dart:io';
import 'package:http/http.dart' as http;
bool _certificateCheck(X509Certificate cert, String host, int port) =>
host == 'local.domain.ext'; // <- change
HttpClient client = new HttpClient()
..badCertificateCallback = (_certificateCheck);
Run Code Online (Sandbox Code Playgroud)
虽然 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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的主目录中,将您的类实例化为全局 HttpOverride:
HttpOverrides.global = new DevHttpOverrides();
Run Code Online (Sandbox Code Playgroud)
这应该使所有客户端忽略不良证书,因此仅在开发中推荐使用。归功于此问题:https : //github.com/dart-lang/http/issues/458
| 归档时间: |
|
| 查看次数: |
12213 次 |
| 最近记录: |