複数のデバイスがあり、それぞれが独自の CA によって署名された X509 証明書を使用して HTTPS サーバーを公開しています。クライアントはローカル ネットワーク内の IP によってこれらのサーバーを呼び出しますが、IP は事前にわかっていないため、証明書には IP が含まれていませんが、カスタム (解決できない) DNS 名が付けられています。
クライアント側 (現在はモバイル アプリ) では、dart HttpClientをSecureContextと共に使用して、CA の証明書をTrustedとして設定し、サーバーを呼び出しています。
ただし、証明書は CA によって署名されていますが、証明書名がサーバーの呼び出しに使用されるローカル IP アドレスと等しくないため、証明書の検証と接続は失敗します。
このユースケースは、 HostnameVerifierを許可する Android/Java でサポートされています。また、 iOS でSecPolicyCreateSSLを使用してそれを行うことも可能であるようです。
したがって、各プラットフォームで Flutter プラグインを作成することもできますが、BoringSSL を使用して SecureSocket を構築する Dart でこれを直接サポートするのが正しいアプローチであると思われます。
ホスト名検証を可能にする Dart lib を作成しようとしています。HttpClient が使用するSecureSocketを何らかの方法でオーバーライドする必要があると思いますが、Dart に含まれている BoringSSL ライブラリを直接呼び出す必要があるかどうかはわかりません (どのように私はそれをしますか?) またはうまくいけば、純粋に Dart でそれを行います。
この検証はopensslで実行できるようです。また、BoringSSL のhandshake_client.ccには、必要なもののほとんどが含まれているようです。
Dartでこれを達成する方法について、誰かが私にいくつかのアイデア/ヒントを教えてもらえますか?
ところで、私はbadCertificateCallbackを試しましたが、一貫してサーバー証明書を返しません。Android ではリーフ/サーバー証明書を返し、iOS では発行者 CA 証明書を返します。いずれにせよ、サーバー証明書が実際に CA によって正しく署名されていることを検証するのに十分なデータが含まれているようです。