特定のhttpsリモートの特定の自己署名サーバー証明書を受け入れるようにGitを構成する


167

私が取り組んでいるプロジェクトのシステム管理者は、SSHは「トラブルが多すぎる」と判断しました。代わりに、https://URL(およびユーザー名/パスワード認証)を介してアクセスできるようにGitを設定しました。このURLのサーバーは自己署名証明書を提示するので、証明書の検証をオフにするよう全員にアドバイスしました。これは、セキュリティ面での良い設定とは言えません。

リモートX(またはそれ以上に始まる、リポジトリ内のリモートhttps://$SERVERNAME/)では、特定の証明書を受け入れ、その証明書のみを受け入れることをGitに伝えることは可能ですか?基本的に、SSHのサーバーキーの動作を複製します。


Unix上のC Gitについて質問していると思いますか?
Piotr Findeisen 2012年

うん。まあ、おそらくWindowsもそうですが、今のところ誰もそうしていません。
zwol 2012年

5
WTF?@Zackあなたは証明書チェックについて絶対的に正しいです。管理者が証明書のチェックをオフにする必要があると言った場合、管理者はサーバーのTLSをオフにすることもできます。
ルディ

@Rudi、サーバーにアクセスするためにIPアドレスを使用する場合も同様です。(DNSルックアップはMITMがその間に入る方法なので、IPアドレスはこれに影響されないはずです。)
Chris

6
@クリスはい、まだそうです。MITMルーターは、任意のIPアドレスを装うことができます。(あなたは空港で無料のwifiで取得するこれらのインタースティシャルページを知っていますか?それらはMITMです。いつかIPアドレスでページにアクセスしてみてください。)
zwol

回答:


295

簡単に:

  1. 自己署名証明書を取得する
  2. いくつかの(例えば~/git-certs/cert.pem)ファイルに入れます
  3. パラメータgitを使用してこの証明書を信頼するように設定しhttp.sslCAInfoます

詳細:

リモートサーバーの自己署名証明書を取得する

サーバーのURLがでrepos.sample.comあり、ポート経由でアクセスしたいと仮定します443

それを取得する方法は複数あります。

opensslを使用して証明書を取得する

$ openssl s_client -connect repos.sample.com:443

ファイルに出力をキャッチcert.pemし、すべてが、一部の間(および含む)を削除-BEGIN CERTIFICATE-し、-END CERTIFICATE-

結果のファイル〜/ git-certs / cert.pemの内容は次のようになります。

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
EwYDVQQIEwxMb3dlciBTYXhvbnkxEjAQBgNVBAcTCVdvbGZzYnVyZzEYMBYGA1UE
ChMPU2FhUy1TZWN1cmUuY29tMRowGAYDVQQDFBEqLnNhYXMtc2VjdXJlLmNvbTEj
MCEGCSqGSIb3DQEJARYUaW5mb0BzYWFzLXNlY3VyZS5jb20wHhcNMTIwNzAyMTMw
OTA0WhcNMTMwNzAyMTMwOTA0WjCBkzELMAkGA1UEBhMCREUxFTATBgNVBAgTDExv
d2VyIFNheG9ueTESMBAGA1UEBxMJV29sZnNidXJnMRgwFgYDVQQKEw9TYWFTLVNl
Y3VyZS5jb20xGjAYBgNVBAMUESouc2Fhcy1zZWN1cmUuY29tMSMwIQYJKoZIhvcN
AQkBFhRpbmZvQHNhYXMtc2VjdXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMUZ472W3EVFYGSHTgFV0LR2YVE1U//sZimhCKGFBhH3ZfGwqtu7
mzOhlCQef9nqGxgH+U5DG43B6MxDzhoP7R8e1GLbNH3xVqMHqEdcek8jtiJvfj2a
pRSkFTCVJ9i0GYFOQfQYV6RJ4vAunQioiw07OmsxL6C5l3K/r+qJTlStpPK5dv4z
Sy+jmAcQMaIcWv8wgBAxdzo8UVwIL63gLlBz7WfSB2Ti5XBbse/83wyNa5bPJPf1
U+7uLSofz+dehHtgtKfHD8XpPoQBt0Y9ExbLN1ysdR9XfsNfBI5K6Uokq/tVDxNi
SHM4/7uKNo/4b7OP24hvCeXW8oRyRzpyDxMCAwEAATANBgkqhkiG9w0BAQUFAAOC
AQEAp7S/E1ZGCey5Oyn3qwP4q+geQqOhRtaPqdH6ABnqUYHcGYB77GcStQxnqnOZ
MJwIaIZqlz+59taB6U2lG30u3cZ1FITuz+fWXdfELKPWPjDoHkwumkz3zcCVrrtI
ktRzk7AeazHcLEwkUjB5Rm75N9+dOo6Ay89JCcPKb+tNqOszY10y6U3kX3uiSzrJ
ejSq/tRyvMFT1FlJ8tKoZBWbkThevMhx7jk5qsoCpLPmPoYCEoLEtpMYiQnDZgUc
TNoL1GjoDrjgmSen4QN5QZEGTOe/dsv1sGxWC+Tv/VwUl2GqVtKPZdKtGFqI8TLn
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Webブラウザーを使用して証明書を取得する

RedmineとGitリポジトリを使用し、Web UIとgitコマンドラインアクセスに同じURLにアクセスします。このように、そのドメインの例外をWebブラウザーに追加する必要がありました。

Firefoxを使用してに移動しOptions -> Advanced -> Certificates -> View Certificates -> Servers、そこで自己署名ホストを見つけて選択し、Exportボタンを使用して、を使用して作成したものとまったく同じファイルを取得しましたopenssl

注:私は少し驚いた、目に見える言及された当局の名前はありません。これで結構です。

信頼できる証明書を専用ファイルに含める

前の手順では、一部のファイルに証明書が含まれます。そのドメインにアクセスするときにgitから見える限り、どのファイルでもかまいません。使った~/git-certs/cert.pem

注:さらに信頼できる自己署名証明書が必要な場合は、同じファイルに入れてください。

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

これは機能します(ただし、1つの証明書でのみテストしました)。

この証明書を信頼するようにgitを構成する

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

--system代わりにを使用して、システム全体に適用することもでき--globalます。

そして、それをテストします。これで、以下に頼らずにサーバーと通信できるようになります。

$ git config --global http.sslVerify false #NO NEED TO USE THIS

gitですでにssl証明書を無視するように設定している場合は、設定を解除します。

$ git config --global --unset http.sslVerify

また、スペルミスなしに、すべて正しく実行されたことを確認することもできます。

$ git config --global --list

すべての変数をリストする必要があります。グローバルに設定しました。(httpをhttにつづりました)。


1
この答えは受け入れられたものよりも正確で完全だと思います。ありがとう@Jan Vlcinsky
Alfredo Cavalcanti

1
その後、通常の機関署名証明書が機能しなくなるため、Githubなどからプルすることはできません。機関が署名した証明書をオフにせずに自己署名証明書を追加する方法はありますか?
Michael Ivko 2014年

4
ここで説明されている「通常の機関署名証明書」を考慮する@MichaelIvkoソリューション(「curl-ca-bundle.crt」ファイルに証明書を追加する必要があります):blogs.msdn.com/b/phkelley/archive/2014/
01/20

3
このアプローチの問題は、gitに付属しているすべてのデフォルトCAを効果的に削除することです(たとえば、これを実行すると、githubからプルできなくなります)。ほとんどの場合、それはほとんどの場合求められていません。より良い例は、新しいルートCAをGit \ bin \ curl-ca-bundle.crtのコピーに追加し、gitconfigからcurl-ca-bundle.crtの新しいコピーを参照することです。
クリムボ2015

3
Windowsでも機能します。証明書チェーン内のすべての証明書をBase64でコード化されたX.509ファイル(.CER)としてエクスポートします。すべてのファイルをまとめて、このファイルを参照します。証明書ファイルへのパスにスペースが含まれていないことを確認してください(古い
学校の

3

OSXユーザー調整。

承認された回答の手順に従うと、OSXで構成するときに少し追加するだけでうまくいきました。

私は置くcert.pem私のOSXがログインしているユーザーの下のディレクトリ内のファイルを、したがって、信頼できる証明書の場所を調整するために私を引き起こしました。

この証明書を信頼するようにgitを構成します。

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.