web-dev-qa-db-ja.com

サーバーがSSLv3を無効にした後、gitが機能しなくなったのはなぜですか?

他のほとんどの場合と同様に、リポジトリサーバーはSSLv3(およびv2)をできるだけ早く無効にする必要があります。

ただし、そうすると、少なくともRHEL5では(私のFreeBSDデスクトップからの接続は正常に機能します)、Gitクライアントが壊れるようです。最新のgit(2.1.2)でも失敗し、OpenSSLライブラリをベンダーの最新のものにアップグレードしても効果がありませんでした。

ただし!同じgit-clientはgithub.comに対して問題なく機能します-github.comではすでにSSLv3も無効になっています。試行錯誤により、私はサーバー(Apache)のSSL構成をgithubのSSL構成と一致するように設定しました。

SSLProtocol     ALL -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite  "AES128-SHA AES256-SHA RC4-SHA"

私たちのサーバーとgithubに対してsslscanを実行することにより、受け入れられる暗号と拒否される暗号の同じリストを取得します。しかし、gitは引き続き失敗します。

    % git clone https://git.example.net/git/puppet-hiera
    Cloning into 'puppet-hiera'...
    * Couldn't find Host git.example.net in the .netrc file, using defaults
    * About to connect() to git.example.net port 443
    *   Trying 10.89.8.27... * connected
    * Connected to git.example.net (10.89.8.27) port 443
    * successfully set certificate verify locations:
    *   CAfile: /etc/pki/tls/certs/ca-bundle.crt
      CApath: none
    * Unknown SSL protocol error in connection to git.example.net:443
    * Closing connection #0
    fatal: unable to access 'https://git.example.net/git/puppet-hiera/': Unknown SSL protocol error in connection to git.example.net:443

現在、サーバーのSSLとGitHubの間に残っている認識できる唯一の違いは、sslscanがGitHubの証明書の詳細を出力できるが、サーバーからそれらを取得できないことです。

FreeBSDデスクトップからgit-serverに接続すると、同じgit cloneコマンドが機能します。失敗する代わりに、CApath: noneを出力した後、次のように表示されます:

      CApath: none
    * SSL connection using AES128-SHA
    * Server certificate:
             subject: C=US; postalCode= ............

クローンは成功します。 GitHubサーバーとは異なり、古いRHEL5システムからでもgitが動作するようにサーバーを構成するにはどうすればよいですか?

更新:単にcurlを使用してサーバーにアクセスしようとすると、SSL互換性に関して同様のエラーが発生しました。しかし、明示的な--tlsv1オプション(-1とも呼ばれる)を指定してcurlを呼び出すことで、これを克服することができました。したがって、RHEL5システム上のソフトウェアはcapableに必要なプロトコルと暗号化方式です-古いプロトコルを試して失敗するのではなく、デフォルトでそれらを使用するにはどうすればよいですか?

5
Mikhail T.

はい、こちらが取引です。今日のApacheでSSLv3を無効にすると、サーバーはクライアントにTLSを使用することを伝えません。クライアントがTLSとの会話を開始しない場合、クライアントは失敗します-ができたとしてもTLSを話します。問題を分析し、Apacheのmod_sslに対して 関連する質問patch を提供してくれたユーザー Chris S。 に感謝します。

Chrisのパッチを見て、Apache開発者はより包括的なパッチを考え出しました。これは次のApacheリリースの一部になるかもしれません。 ApacheのSSLProtocolsディレクティブの新しいオプションANYが導入されています。 ApacheがANYを検出すると、接続しているクライアントに(SSLv2Hello経由で)TLSに切り替える必要があることを通知します。

SSLProtocol ANY -SSLv2 -SSLv3

Apache 2.4.11を待つ余裕のない人のために、ここにパッチを貼り付けています。

Index: modules/ssl/ssl_private.h
===================================================================
--- modules/ssl/ssl_private.h    (revision 1635012)
+++ modules/ssl/ssl_private.h    (working copy)
@@ -295,8 +295,10 @@ typedef int ssl_opt_t;
 #define SSL_PROTOCOL_TLSV1_2 (1<<4)
 #define SSL_PROTOCOL_ALL   (SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1| \
                 SSL_PROTOCOL_TLSV1_1|SSL_PROTOCOL_TLSV1_2)
+#define SSL_PROTOCOL_ANY   (1<<5)
 #else
 #define SSL_PROTOCOL_ALL   (SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1)
+#define SSL_PROTOCOL_ANY   (1<<3)
 #endif
 typedef int ssl_proto_t;

Index: modules/ssl/ssl_engine_init.c
===================================================================
--- modules/ssl/ssl_engine_init.c    (revision 1635012)
+++ modules/ssl/ssl_engine_init.c    (working copy)
@@ -490,6 +490,7 @@ static apr_status_t ssl_init_ctx_protocol(server_r
     }

     cp = apr_pstrcat(p,
+                     (protocol & SSL_PROTOCOL_ANY ? "SSLv23, " : ""),
              (protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""),
              (protocol & SSL_PROTOCOL_TLSV1 ? "TLSv1, " : ""),
 #ifdef HAVE_TLSV1_X
Index: modules/ssl/ssl_engine_config.c
===================================================================
--- modules/ssl/ssl_engine_config.c    (revision 1635012)
+++ modules/ssl/ssl_engine_config.c    (working copy)
@@ -1311,6 +1311,9 @@ static const char *ssl_cmd_protocol_parse(cmd_parm
     else if (strcEQ(w, "all")) {
         thisopt = SSL_PROTOCOL_ALL;
     }
+        else if (strcEQ(w, "any")) {
+            thisopt = SSL_PROTOCOL_ANY|SSL_PROTOCOL_ALL;
+        }
     else {
         return apr_pstrcat(parms->temp_pool,
                parms->cmd->name,
Index: modules/ssl/ssl_engine_io.c
===================================================================
--- modules/ssl/ssl_engine_io.c    (revision 1635012)
+++ modules/ssl/ssl_engine_io.c    (working copy)
@@ -1137,6 +1137,7 @@ static apr_status_t ssl_io_filter_handshake(ssl_fi
      * IPv4 and IPv6 addresses are not permitted".)
      */
     if (hostname_note &&
+            !(sc->proxy->protocol & SSL_PROTOCOL_ANY) &&
         sc->proxy->protocol != SSL_PROTOCOL_SSLV3 &&
         apr_ipsubnet_create(&ip, hostname_note, NULL,
                 c->pool) != APR_SUCCESS) {
6
Mikhail T.

Gitクライアントが機能するようにサーバー側の調整を行う方法について提供した説明が気に入っています。私の問題は、サーバーを変更する機能がないjazzhubに接続しようとしていました。私はこの解決策を今日(そして昨晩遅く)思いついた:

https://developer.ibm.com/answers/answers/164635/view.html

フィードバックがありましたら、ぜひお聞かせください。

-マイケル

0