OpenSSLを使用するCサーバーアプリケーションがあり、同じポート上のすべてのトラフィックを受信します。受信データがSSL接続かどうかを確認する安全な方法はありますか?接続がSSLであるかどうかをチェックする方法は?
答えて
TLS接続で最初に起こることは、クライアントがClientHelloを送信することです。 ClientHelloは、それをハンドシェイクメッセージとして識別するバイト値22
('\x16'
)で始まります。
アプリケーションプロトコルがテキストベースの場合は、22
バイト(印刷可能な文字ではありません)が含まれないため、最初のバイトでyour-protocol-over-TCPとyour-protocol-overを区別できます。 -TLS-over-TCP。
アプリケーションプロトコルがテキストベースでなく、クライアントが22
バイトを送信してから非TLS接続を開始する可能性がある場合は、さらに深く掘り下げなければなりません。次の2バイトは、TLSのメジャーバージョン番号とマイナーバージョン番号です。現在、メジャーバージョンのバイトは3
、マイナーバージョンのバイトは1
から3
の範囲のどこかにあると期待できます。時代遅れのバージョンのSSLを使用しているクライアントがあれば、より低い数字が可能になり、TLSの将来のアップデートでより高い数字が可能になるので、柔軟にする必要があります。
22
を、プロトコルの非TLSバージョンの最初のバイトとして除外することをお勧めします。
recv
とMSG_PEEK
を使用すると、最初のバイトを消費せずに検査することができます。したがって、決定が終わっても、TLSライブラリまたはアプリケーションプロトコルが読み取れるようになります。
もう1つの複雑な問題:アプリケーションプロトコルでサーバーがクライアントの前に話す必要がある場合は、問題があります。クライアントが接続すると、TLS以外の挨拶を待っているか、ClientHelloを送信している可能性があります。この問題は、タイムアウトによってのみ解決できます。クライアントが何らかのタイムフレーム内に何も送信しない場合は、ClientHelloを送信せず、TLS以外のバージョンのプロトコルを使用しないと想定します。これにより、非TLSクライアントに対して接続の開始が遅れることがありますが、これを避ける方法はありません。
...古い破損したバージョンを参照していないときは、プロトコルの名前として「SSL」の使用をやめてみましょう。 TLSはすでにここにあります! –
ありがとう、それはまさに私が探していた答えです! – Marco
自分で接続を受け入れ、接続を受け入れた後でSSLハンドシェイクに移行する場合は、自分で追跡する必要があります。
単純な解決策は、受け入れられたソケット記述子を含む構造体と、SSL接続の場合はブール型フラグを持ち、それらの構造体のリストを持つことです。
- 1. Rails 3.2がMySQLに接続できるかどうかをチェックする方法?
- 2. UITextFieldsが空であるかどうかをチェックする方法?
- 3. java.lang.reflect.TypeがEnumであるかどうかをチェックする方法
- 4. シンボルが手続きかどうかをチェックする方法
- 5. C#シリアルポートデバイスが接続されているかどうかをチェック
- 6. 誰かがユーザーであるかどうかをチェックする方法は?
- 7. JSONオブジェクトがJavaで空であるかどうかをチェックする方法は?
- 8. JSONオブジェクトがPHPで空であるかどうかをチェックする方法は?
- 9. リテラルがJavaでlong型であるかどうかをチェックする方法は?
- 10. Pythonで変数が空であるかどうかをチェックする方法は?
- 11. Silverlightでインターネット接続が利用できるかどうかをチェックする方法OOB
- 12. 値がリストにあるかどうかチェックする方法
- 13. 空であるかどうかチェックボックスをチェックする方法
- 14. テンプレートタイプが別のテンプレートタイプであるかどうかをチェックする方法は?
- 15. テンプレートパラメータがイテレータの型であるかどうかをチェックする方法は?
- 16. ハドソンがビジーであるかどうかをチェックする方法は?
- 17. POSTフォームのデータが空であるかどうかをチェックする方法は?
- 18. オブジェクトがJavascriptの「サブオブジェクト」であるかどうかをチェックする方法は?
- 19. Tが集合型であるかどうかをチェックする方法は?
- 20. オブジェクトが「深い空」であるかどうかをチェックする方法は?
- 21. ポリゴンが凸であるかどうかをチェックする方法は?
- 22. SSL証明書があってもSSL接続は安全ですか?
- 23. エッジがあるサイクルにあるかどうかをチェックする方法?
- 24. ソケット接続がBoost :: asioに存在するかどうかをチェックする方法?
- 25. perlでハッシュリファレンスが空であるかどうかをチェックする方法
- 26. C#でExcel範囲が空であるかどうかをチェックする方法
- 27. perlでハッシュが空であるかどうかをチェックする方法
- 28. NHibernate(HQL)でコレクションが空であるかどうかをチェックする方法?
- 29. ファイルがBashで空であるかどうかをチェックする方法?
- 30. FlexでXML値がnullであるかどうかをチェックする方法
単一のポートを使用してサーバー内のすべての接続を受け入れることを意味しますか?その後、接続を受け入れたらSSLネゴシエーションを実行しますか?ライブラリ関数を使用して接続を処理していませんか? –
あります。私はトラフィックの種類を決定する必要がありますし、それがSSLであればSSLネゴシエーションを行い、そうでなければ別の方法でそれを処理します。 – Marco