接受任何SSL证书会导致我的程序挂起

时间:2014-09-26 20:06:01

标签: http ssl dart

我有以下飞镖计划:

import "dart:io";
import "dart:convert" show UTF8;

void main() {
  HttpClient client = new HttpClient();
  client.badCertificateCallback = (certificate, host, callbackPort) {
    print("In bad certificate callback.");
    return true;
  };
  client.getUrl(Uri.parse("https://www.self.signed.url.com/api")).then((HttpClientRequest request) {
    print("In request callback.");
    return request.close();
  }).then((HttpClientResponse resp) {
    print("In responce callback.");
  });
}

此代码向网址发出get请求。该URL使用自签名证书,这会导致SSL错误。为了解决这个问题,我将badCertificateCallback的{​​{1}}设置为始终返回true,从而有效地接受所有证书。

使用此代码,我希望看到以下输出:

HttpClient

然后让程序退出。相反,我看到了:

In request callback.
In bad certificate callback.
In responce callback.

程序挂起。关于我做错了什么想法?

更新:根据一些评论的建议,我提交了一个Dart错误。它可以找到here。如果有任何结果,我会将结果反馈到此。

1 个答案:

答案 0 :(得分:2)

事实证明,它与HTTPS无关,而是在https://checkmate.fogbugz.com/api.xml服务器上处理HTTP协议。 Dart HTTP堆栈以小写形式发送所有头字段名称。服务器无法正确处理。

以下代码说明了这一点:

import 'dart:io';
import 'dart:convert';

void main() {
  SecureSocket.connect("checkmate.fogbugz.com", 443).then((socket) {
    socket.write("GET /api.xml HTTP/1.0\r\n"
                 "host: checkmate.fogbugz.com\r\n"
                 "\r\n");
    socket.listen((data) => print(UTF8.decode(data)));
  });
}

未收到任何回复。如果host:更改为Host:,则会收到回复。

RFC 2616 section 4.2声明:'字段名称不区分大小写。'