他のほとんどの場合と同様に、リポジトリサーバーは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に必要なプロトコルと暗号化方式です-古いプロトコルを試して失敗するのではなく、デフォルトでそれらを使用するにはどうすればよいですか?
はい、こちらが取引です。今日の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) {
Gitクライアントが機能するようにサーバー側の調整を行う方法について提供した説明が気に入っています。私の問題は、サーバーを変更する機能がないjazzhubに接続しようとしていました。私はこの解決策を今日(そして昨晩遅く)思いついた:
https://developer.ibm.com/answers/answers/164635/view.html
フィードバックがありましたら、ぜひお聞かせください。
-マイケル