問題タブ [boringssl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
flutter - Dart/Flutter HttpClient のカスタム SSL ホスト名ベリファイアを作成する方法
複数のデバイスがあり、それぞれが独自の 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 によって正しく署名されていることを検証するのに十分なデータが含まれているようです。
java - Netty ソケット SSLHandshakeException WRONG_VERSION_NUMBER
netty パイプラインでの証明書の使用に問題があります。Netty パイプラインは Spring によって実行されますが、SSL は Netty 部分の一部にすぎません。
依存関係については、netty と Boringssl を使用しています
sslhandler を追加してパイプラインを開始します
関数からハンドラを取得する
そして最後に文脈を作る
PrivateKey と CertChain は適切に構築されていますが、クライアントが初めて接続しようとすると、
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: エラー:100000f7:SSL ルーチン:OPENSSL_internal:WRONG_VERSION_NUMBER
過去に別のサーバーに接続してこれを機能させたことがありますが、その後は正常に機能しました。チャネルが初期化中であり、ソケットから読み取ろうとするとクラッシュします。私のtry catchにはヒットせず、以下のスタックトレースのみを報告します。
私は現在、TLSv1.3 を扱っていることを知っていますが、以前は何が使用されていたのか正確にはわかりません。さらに、この問題が発見されたとき、私は JDK 1.8 を使用していました。現在は JDK 17 を使用しています。1.8 のすべてのバージョンが TLSv1.3 をサポートしているわけではないという人がいることに気付きました。