我有多个设备,每个设备都公开了一个带有我自己的 CA 签名的 X509 证书的 HTTPS 服务器。客户端通过本地网络中的 IP 调用这些服务器,但事先不知道 IP,因此证书不包含 IP,但它们具有自定义(不可解析)DNS 名称。
在客户端(现在是移动应用程序),我使用带有SecureContext的 dart HttpClient将我的 CA 证书设置为受信任并调用服务器。
但是证书验证和连接失败,因为虽然证书是由我的 CA 签名的,但证书名称不等于用于调用服务器的本地 IP 地址。
允许HostnameVerifier的 Android/Java 支持此用例。而且似乎也可以在 iOS 中使用SecPolicyCreateSSL 来实现。
所以我可以在每个平台上编写一个 Flutter 插件,但在我看来,正确的方法是直接在 Dart 中支持这一点,它使用 BoringSSL 来构建 SecureSocket。
我正在尝试编写一个允许主机名验证器的 Dart 库,我认为我必须以某种方式覆盖 HttpClient 使用的SecureSocket,但我不确定我是否必须直接调用 Dart 包含的 BoringSSL 库(如何我应该这样做吗?)或者希望只是在 Dart 中完成。
看起来可以使用openssl完成此验证。BoringSSL中的handshake_client.cc似乎拥有大部分需要的东西。
谁能给我一些关于如何在 Dart 中实现这一点的想法/提示?
顺便说一句,我已经尝试过badCertificateCallback,但它并没有一致地返回服务器证书,在 Android 中它返回叶/服务器证书,在 iOS 中它返回颁发者 CA 证书。无论哪种方式,它似乎都包含足够的数据来验证服务器证书实际上是否由 CA 正确签名。