web-dev-qa-db-ja.com

OpenSSL:プロトコルバージョンごとに暗号スイートを有効にする

OpenSSLを明示的に構成して、TLSバージョン> = 1.1を使用するクライアントに対してのみAES(または一般にブロック暗号)を許可する方法はありますか?

これは、BEAST攻撃から保護する一方で、古代のRC4よりも安全な暗号の使用を許可します。

OpenSSLの推奨される回避策 (サーバーの暗号化優先順位を強制します。AES-CBCよりもRC4よりもAES-GCMを優先します)GCM暗号スイートをサポートしていないすべてのクライアントを除外します。 TLS 1.1での修正により、AES-CBCを安全に使用する方法。

多くの人気サイトがすべてにRC4を使用することを選択しているようですが、これは本当に良いアイデアのようには思えません(RC4には多くの既知の弱点と多くのTLS実装があります TLS <= 1.1でも回避策があります =)。サーバー側の「AESを使用するが、それが安全である場合のみ」のフラグが状況を改善できるのだろうか。

2
lxgr

OpenSSLのソースコードをざっと見てみると、いいえ、ライブラリは希望どおりではありません。暗号スイートの選択はssl3_choose_cipher()ssl/s3_lib.c)そしてその関数は「サポートされている暗号スイート」のリストで動作します。リストは、ネゴシエートされたバージョンに応じてprunedです(OpenSSLは、使用されるバージョンでサポートされていない暗号スイートを選択しません)。リストには、バージョン固有の設定は含まれていません。

プログラム的には、ClientHelloメッセージを認識し、そのメッセージで通知された最大バージョンに基づいてOpenSSL設定を動的に調整する入力データに入力フィルターを作成することが可能です。これはかなり恐ろしいハックであり、「うまくいく」でしょう。ただし、構成だけではそれはありません。

少なくとも protocol は、取得したいものをサポートします。これは反対方向には当てはまりません。クライアントは、1つのメッセージで、クライアントが受け入れる最大バージョンを通知するため、サポートする暗号スイートのリストがあります。クライアントが「AES-CBCではなくTLS 1.1+のみ」と言う方法はありません。

4
Tom Leek