はい!今やってます!

Work Pertly, Live Idly

Dartでhttpパッケージを使ってAPIリクエストを投げたらCERTIFICATE_VERIFY_FAILEDになるときの対応方法

この記事は何?

Flutterのhttp/http.dartパッケージを使ってAPIリクエストを投げたら、送信先のサーバーが証明書を設定しておらずCERTIFICATE_VERIFY_FAILEDになるときの対応方法。 証明書エラーを無視してリクエストを送信したいときの方法を記載しています。

経緯

FlutterをDartで書いていて、API Clientにhttp/http.dartのパッケージを利用してAPIリクエストをサーバー側に送信していた。

import 'package:http/http.dart'

String url = "https://hogehoge/fuga";
Map<String, String> headers = {'content-type': 'application/json'};
String body = json.encode({'hoge': hoge, 'limit': 1000, 'offset': 0});
var response = await http.post(url, headers: headers, body: body);
var records = json.decode(response.body);

ちょっとサーバー上で動かすデモAPIができたので、リクエストしようと思ったら

CERTIFICATE_VERIFY_FAILED

というエラーが出た。 実際に表示されたエラーはこちら↓

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: HandshakeException: Handshake error in client (OS Error:
    CERTIFICATE_VERIFY_FAILED: ok(handshake.cc:352))
#0      IOClient.send (package:http/src/io_client.dart:33:23)
<asynchronous suspension>
#1      BaseClient._sendUnstreamed (package:http/src/base_client.dart:169:38)
<asynchronous suspension>
#2      BaseClient.post (package:http/src/base_client.dart:54:7)
#3      post.<anonymous closure> (package:http/http.dart:70:16)
#4      _withClient (package:http/http.dart:166:20)
<asynchronous suspension>
#5      post (package:http/http.dart:69:5)

対応

  • 概要

httpのclientio_clientでwrapしてリクエストを送信し、その際にbadCertificateCallbackを設定してやる。

  • コード
import 'package:http/io_client.dart';
import 'dart:io';
import 'package:http/http.dart'


HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
final http = new IOClient(client);

String url = "https://hogehoge/fuga";
Map<String, String> headers = {'content-type': 'application/json'};
String body = json.encode({'hoge': hoge, 'limit': 1000, 'offset': 0});
var response = await http.post(url, headers: headers, body: body);
var records = json.decode(response.body);

これでOK