Skip to content

Instantly share code, notes, and snippets.

@slightfoot
Created November 19, 2025 19:16
Show Gist options
  • Select an option

  • Save slightfoot/b540aa22f8c0b613c29a69496ee8e467 to your computer and use it in GitHub Desktop.

Select an option

Save slightfoot/b540aa22f8c0b613c29a69496ee8e467 to your computer and use it in GitHub Desktop.
Certificate Pinner in Dart and Flutter - by Simon Lightfoot :: #HumpdayQandA on 19th November 2025 :: https://www.youtube.com/watch?v=OMlHgFZy4cg
// MIT License
//
// Copyright (c) 2025 Simon Lightfoot
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:http/io_client.dart';
void main() {
final client = pinnedCertClient();
makeApiCall(client);
client.close();
}
void makeApiCall(http.Client client) async {
final response = await client.get(Uri.parse('https://docs.flutter.dev'));
print(response.body);
}
http.Client pinnedCertClient() {
final secureContext = SecurityContext();
secureContext.setTrustedCertificatesBytes(myCert.codeUnits);
return IOClient(HttpClient(context: secureContext));
}
final myCert = '''
-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIQAmWO3MU+UrMSCZ6V6QpJgjANBgkqhkiG9w0BAQsFADA7
MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZpY2VzMQww
CgYDVQQDEwNXUjMwHhcNMjUxMDIyMjMyNTM3WhcNMjYwMTIxMDAyNDM2WjAbMRkw
FwYDVQQDExBkb2NzLmZsdXR0ZXIuZGV2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAqts0yeLgDWLpXG8sRB2iQ8Ij3zzELdn6D6ExCQIkUHGCv6Huwl9Q
8PIIXsiZyat+iSQvQhBZ9wSHYYuYFWvXDt1Kxj1ANOKFWDkWWviC9zWdhdaKPdlY
ztCJecN+nArrGPn6JHopjPGrpoCyNq5OHXNynFGBtfv0aHfPm371Y/eUraUOdEBD
MlX3toOcyhILlZnjQh6GldEV9NsGdz5APQ/Fzwnwjvpt4aPJHVPaCF9AGkA0l4YO
+qq77J8tvq+d/DXLsdDzu/zHhyZrFyIDa8C5x+cwh8P2ohtDc5YvLg4JhnGypIjY
/vxM46ZOlhq1BdEIkF49LQbJWWD5XlVUVQIDAQABo4ICSDCCAkQwDgYDVR0PAQH/
BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0O
BBYEFCFFwjusTCzra0+158niw2rRvbPCMB8GA1UdIwQYMBaAFMeB9f2OiNkAPE1j
olAxJKDOI/4jMF4GCCsGAQUFBwEBBFIwUDAnBggrBgEFBQcwAYYbaHR0cDovL28u
cGtpLmdvb2cvcy93cjMvQW1VMCUGCCsGAQUFBzAChhlodHRwOi8vaS5wa2kuZ29v
Zy93cjMuY3J0MBsGA1UdEQQUMBKCEGRvY3MuZmx1dHRlci5kZXYwEwYDVR0gBAww
CjAIBgZngQwBAgEwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2MucGtpLmdvb2cv
d3IzLzNxLUxUOXY1UXBBLmNybDCCAQMGCisGAQQB1nkCBAIEgfQEgfEA7wB2AA5X
lLzzrqk+MxssmQez95Dfm8I9cTIl3SGpJaxhxU4hAAABmg509xcAAAQDAEcwRQIh
AMBRL6XxrOF5KakKv67ove96Am2WBB3S3Z2qx3qiXhqkAiAXAReDioH9DcWPA9Jw
IleW1iLBs7/BYhcXJuOLmZBZMgB1ANFuqaVoB35mNaA/N6XdvAOlPEESFNSIGPXp
MbMjy5UEAAABmg50+BEAAAQDAEYwRAIgCjg6v5HXfWWKEj8G0OqfHsy9CNKKL16F
K4COEauP58QCIA+l7Y3q9uCL6k4qbWbo2BqRhayUBMPlZ2etadHP7vTcMA0GCSqG
SIb3DQEBCwUAA4IBAQB0CpE6E2SM8PQA0cKzzizPfuUQl+i8F2MEK0oE/OlgH6Ny
X1pqpyRyII9d+g7TFEImf8KjF5Go/sIfZRmxwvxP1tebvj6/I4dVwb16h/OofwZb
tgCiisdK+tIPaqJ6yaPL+BYR/d545X1sumKmd41oB+lMjIKcdnWYw1KpVwIlRzfV
iUq25fpYRhDJYaIYntfKrFDvtmRafatJjatMAglt0IMXbjrqAyOHTUdkaqyE/+Fp
Xu/09ofDs2vgEYL1hHcGS/63AqyVhzw6w8iiZ7LpbhBGmPM6hPnERIiGPHGFWoVu
2hDAL9XPOGM9jegbV+kfIHkJJO5+FZQReueqoIBo
-----END CERTIFICATE-----
''';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment