web-dev-qa-db-ja.com

接続のSSLバージョンをサーバー側からのみアップグレードすることはできますか?

サーバー側の変更のみを行うことで、接続のSSLバージョンをSSLv3からTLSv1にアップグレードする方法があるかどうかを確認しようとしています。

私の場合、クライアントアプリケーションとサーバーの両方がOpenSSL(v0.9.8o)を使用しているため、どちらもTLSv1までのSSLバージョンをサポートしています。クライアントがサーバーとの接続を確立するたびに、デフォルトでSSLハンドシェイク(ClientHello、バージョン3.0)を開始するときにSSLv3.0を使用するため、SSLv3.0を使用してサーバーとの接続が確立されます。

編集:クライアントアプリケーションのデフォルトのSSLバージョンは、SSLv3.0にハードコードされています。

クライアント側のコードを変更せずに、サーバー側のコードを変更するだけで接続をTLSv1にアップグレードする方法はありますか。おそらくSSL再ネゴシエーションを使用しますか?

注:もちろん、TLSv1を使用してハンドシェイクを開始するようにクライアントアプリケーションのデフォルトバージョンを変更しても、TLSv1接続は正常に確立されますが、これは、さまざまな理由で私の場合のオプションではありません。

すべての参照は非常に高く評価されています。ご協力いただきありがとうございます。

2
jaybird19

SSL/TLSハンドシェイクでは、クライアントは(ClientHelloの一部として)サポートする最大バージョンを送信します。次に、サーバーは使用するバージョンを選択します。これは、サーバーがサポートする最高のバージョンである必要がありますが、クライアントから送信された値以下でなければなりません。

  • クライアントが「SSL 3.0」をサポートされる最高のバージョンとして送信する場合、サーバーはSSL 3.0を使用していることになります。

  • クライアントがSSL 3.0のみをサポートしている場合、SSL 3.0以外は取得できません。

  • 再交渉は何も変更しません。再交渉は単に新しいハンドシェイクです。クライアントが実際にClientHelloで「SSL 3.0」と言いたい場合は、何度も繰り返します。

  • クライアントが実際に下位バージョン(TLS 1.0以降)をサポートしているが、そうではない場合は、次のようにします。

    1. クライアントにバグがあるか、愚かなことをしているため、修正する必要があります。
    2. クライアントは標準に準拠していないため、その動作について何かを確実に想定することは困難です。
    3. それにもかかわらず、conceivableサーバーがより高いバージョン(たとえば、TLS 1.0)で応答した場合、クライアントはそれを超えていてもそれを使用することを受け入れますクライアントが発表した値

クライアントがOpenSSLを共有ライブラリ(別名「DLL」)として使用している場合は、OpenSSL DLLを、クライアントから提供されたバージョン番号を無視する別のものと置き換えることができます。これは実際にサポートしていることを通知します。これはクライアント側の種類の変更であり、クライアントアプリケーション自体のコードを変更する必要がないため、そのアプリケーションのソースコードが利用できない場合でも適用できます。ひどいハック。

別の解決策は、クライアントをある種のクライアント側プロキシの内側にラップすることです。つまり、本質的に 中間者攻撃 を実行します。


上記の方法でクライアントを実際に変更できない場合は、SSL 3.0の既知の欠点を最小限に抑える暗号スイートを(サーバーで)選択することを期待できます。特に、RC4を使用して暗号を適用すると、POODLE攻撃を回避できます(ただし、RC4で既知のバイアスが発生します。毒を選択してください)。

1
Thomas Pornin

クライアント側で何かが間違っているようです。

クライアントはセッションを開始する必要があります 受け入れることができる最も高いプロトコルバージョンを示します

TLS v1は "3.1"として列挙され、> SSL3を示します。

SSLのClientHelloおよびServerHelloメッセージでネゴシエートされるバージョン番号は3.0以下であるため、TLSおよび将来のビジョンでネゴシエートされるバージョン番号は、バージョン3.1以降としてネゴシエートすることで続行されます。これは、SSL 3.0のリビジョンを示すために行われますが、SSLまたはTLSのいずれかを使用するクライアントとサーバー間の下位互換性を促進します。

ソース

さらなる解明:

クライアントはサポート可能な最高のバージョンを宣言する必要があり、サーバーは受け入れるか、サポートされているより低いバージョンを提供するか、PROTOCOL_VERSIONを宣言して終了します。 ietf.org から:

TLSサーバーは、サポートされている最も高いバージョンよりも小さいバージョン番号を含むClientHelloも受信できます。サーバーが古いクライアントとネゴシエートする場合は、サーバーがサポートするClientHello.client_version以下の最も高いバージョンに応じて適切に処理されます。たとえば、サーバーがTLS 1.0、1.1、および1.2をサポートし、client_versionがTLS 1.0である場合、サーバーはTLS 1.0 ServerHelloを続行します。サーバーがclient_versionより大きいバージョンのみをサポートする(または使用する意思がある)場合、「protocol_version」アラートメッセージを送信して接続を閉じる必要があります。

1
Digital Chris

より低いレベルの接続を使用したくない場合は、単にそれを拒否できます。 SSL/TLS接続を確立するとき、サーバーはクライアントに何がサポートできるかを知らせ、2つは最適なオプションを見つけ出します。

クライアントがTLSをサポートし、SSL3.0に強制されている場合、クライアント側で何か問題がある可能性があります(または、たとえば古いSSLプロキシである可能性があります)。パスに沿った何かがTLSの選択を許可していないか、クライアントの設定が非常に奇妙に設定されており、セキュリティの高い接続よりもセキュリティの低い接続を選択しています。

最善の策は、SSL3.0を使用したくない場合は単にSSL3.0を許可しないことです。サーバーがそれをサポートしている場合、攻撃者がクライアントをより低いレベルのプロトコルに強制するのは非常に簡単なので、最善のオプションはそれをサポートしないことです。これは、非常に古いブラウザを使用している数人のユーザーがサイトにアクセスできない可能性があることを意味しますが、サイトを開いたままにしておくと、すべての訪問者が危険にさらされる可能性があります。

0
AJ Henderson