どうすればgitに自己署名証明書を受け入れさせることができますか?


648

Gitを使用して、自己署名証明書を受け入れるように指示する方法はありますか?

httpsサーバーを使用してgitサーバーをホストしていますが、現時点では証明書は自己署名されています。

そこで初めてリポジトリを作成しようとすると:

git push origin master -f

エラーが発生します:

error: Cannot access URL     
https://the server/git.aspx/PocketReferences/, return code 22

fatal: git-http-push failed

4
問題が証明書であることをどのようにして知っていますか?
アンバー

1
代わりにPCから他のユーザーのGitツールを使用すると、証明書を無視して機能します。Macからは、無視する方法がわかりません。
Ian Vink

git 2.1.1で発生したエラー:「致命的: 'https://.../project.git/'にアクセスできません:SSL証明書の問題:証明書チェーン内の自己署名証明書」
Stan Kurdziel

OSX / Macintoshでは、それはそうです gitのは使用しませんのようなsslcainfoオプションを選択します。を使用curl --cacertしてリポパスを正常にプルできるが、gitが機能しない場合は、証明書を不可解なOSXキーチェーンプログラムに追加する必要があります。もっとここsuperuser.com/questions/605900/...
amwinter

このドキュメントは便利ですgist.github.com/evantoli/f8c23a37eb3558ab8765
Mofaggol Hoshen

回答:


1168

特定の証明書を永続的に受け入れるには

http.sslCAPathまたはを試してくださいhttp.sslCAInfoアダム・スパイアーズの答えは、いくつかの素晴らしい例を示しています。これは、質問に対する最も安全なソリューションです。

単一のgitコマンドのTLS / SSL検証を無効にするには

合格しようと-cするgit適切なコンフィギュレーション変数で、または使用フローの答えを

git -c http.sslVerify=false clone https://example.com/path/to/git

特定のリポジトリのSSL検証を無効にするには

リポジトリが完全に管理下にある場合は、次のことを試すことができます。

git config --global http.sslVerify false

にはかなりの数のSSL設定オプションがありますgit。のマニュアルページからgit config

http.sslVerify
    Whether to verify the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_NO_VERIFY environment variable.

http.sslCAInfo
    File containing the certificates to verify the peer with when fetching or pushing
    over HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.

http.sslCAPath
    Path containing files with the CA certificates to verify the peer with when
    fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CAPATH environment variable.

他のいくつかの便利なSSL構成オプション:

http.sslCert
    File containing the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CERT environment variable.

http.sslKey
    File containing the SSL private key when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_KEY environment variable.

http.sslCertPasswordProtected
    Enable git's password prompt for the SSL certificate. Otherwise OpenSSL will
    prompt the user, possibly many times, if the certificate or private key is encrypted.
    Can be overridden by the GIT_SSL_CERT_PASSWORD_PROTECTED environment variable.

40
「git config --global http.sslVerify false」がトリックをしました。ありがとうございました!
クリスストーリー

110
TLS(/ SSL)証明書の検証をグローバルに無効にしないでください。
2015

4
@Flow-私は完全に同意します。TLS / SSL証明書の検証を無効にすることについてより論争を呼ぶように、この(現在はかなり古い)回答を編集しました。
クリストファー

8
これでgit -c http.sslVerify=false clone https://domain.com/path/to/git私の問題は解決しました。ありがとう...
フェルナンドゴメス

2
@Flow 雇用主がMITMである職場環境にいる場合、TLS / SSLをグローバルに無効にする代わりにどのような選択肢がありますか?
Stevoisiak 2017

165

あなたは、設定することができますGIT_SSL_NO_VERIFYしますtrue

GIT_SSL_NO_VERIFY=true git clone https://example.com/path/to/git

または、コマンドラインで接続を確認しないようにGitを構成します。

git -c http.sslVerify=false clone https://example.com/path/to/git

SSL / TLS証明書を確認しないと、MitM攻撃の影響を受けやすくなります


2
-cフラグon gitを使用して、単一のコマンドの構成値を変更することもできます。ただし、この構文はよりクリーンだと思います。
クリストファー

1
ああ、-cgit については知りませんでした。実際には、環境を汚染するのではなく、よりクリーンなソリューションだと思います。:)
フロー

1
@SkylarSaveland git -c http.sslVerify=false <gitSubCommand>仲介者を通じても機能することに注意してください。
フロー

1
このソリューションは、中間者攻撃に対してあなたを開くことに注意してください。
omikron

2
回答では、最も安全性の低いオプションについてのみ説明します
cp.engr 2017

139

セキュリティチェックを無効にするのは最後の手段であり、最初に提供されるソリューションではないため、私は既存の回答の[編集:のオリジナルバージョン]の大ファンではありません。追加の検証方法がないと、最初のレシートで自己署名証明書を信頼することはできませんが、後続のgit操作に証明書を使用すると、少なくとも、証明書をダウンロードした後にのみ発生する攻撃に対して非常に困難になります。つまり、ダウンロードした証明書本物であれば、それ以降は問題ありません。対照的に、単に検証を無効にすると、任意の時点であらゆる種類の中間者攻撃広くさらされます。

具体例を示すと、有名なrepo.or.czリポジトリは自己署名証明書を提供します。そのファイルをダウンロードして、のような場所に置いて/etc/ssl/certsから、次の操作を実行できます。

# Initial clone
GIT_SSL_CAINFO=/etc/ssl/certs/rorcz_root_cert.pem \
    git clone https://repo.or.cz/org-mode.git

# Ensure all future interactions with origin remote also work
cd org-mode
git config http.sslCAInfo /etc/ssl/certs/rorcz_root_cert.pem

ここでローカルgit config(つまりなし--global)を使用することは、この自己署名証明書がこの特定のリポジトリに対してのみ信頼されることを意味することに注意してください。また、侵害される可能性のある別の認証局を介して検証を行うGIT_SSL_CAPATHリスクがなくなるため、使用するよりも優れてgitいます。


3
偶然にも、http.sslCAPathはlibcurlのssl_capathロジックを使用しています。実際には、任意の数の証明書を/etc/ssl/certs/ディレクトリに保存でき、必要なものすべてを効率的に分類できると思います。私はこれをテストしていませんが、念のためですが--global、証明書をたくさん使ってを使用できるかもしれません。しかし、価値のあるテストです。
クリストファー

6
完全にSSL認証を無効にするリスクを考慮すると、実際の質問に「どのように私はGitは受け入れることができますされた自己署名証明書を?」、これが受け入れ答えなければなりません。
PLNech

5
理想的な世界では、次のようなものになりますgit config http.validCertFingerprint <base64-encoded-hash-of-certifcate>
Flow

1
私のシナリオで実際に機能するインターネット上の唯一の答え。それはプライベートComposer VCSライブラリであり、SSL経由でセルフホストされたGitlabでホストされ、gitによってバージョン管理されたプロジェクトで必要なものです。
Dejv

1
新鮮なクローンから。これは1行で実行できますgit clone --config http.sslCAInfo=<path_to_cert> https://repo.or.cz/org-mode.git(後から「git config」コマンドを呼び出す必要はありません)。
アーロン

39

Git自己署名証明書の構成

tl; dr

すべてのSSL検証を無効にしないでください!

これは悪いセキュリティ文化を作り出します。その人になってはいけません。

あなたが探している設定キーは:

  • http.sslverify- 常に真実。上記の注を参照してください。

これらは、信頼するホスト証明書を構成するためのものです。

これらは、SSLチャレンジに応答するように証明書を構成するためのものです。

上記の設定を特定のホストに選択的に適用します。

.gitconfig自己署名認証局のグローバル

私自身と同僚のために、ここで、無効にすることなく自己署名証明書を機能させる方法を説明しsslVerifyます。これらを使用して編集してください.gitconfiggit config --global -e

# Specify the scheme and host as a 'context' that only these settings apply
# Must use Git v1.8.5+ for these contexts to work
[credential "https://your.domain.com"]
  username = user.name

  # Uncomment the credential helper that applies to your platform
  # Windows
  # helper = manager

  # OSX
  # helper = osxkeychain

  # Linux (in-memory credential helper)
  # helper = cache

  # Linux (permanent storage credential helper)
  # https://askubuntu.com/a/776335/491772

# Specify the scheme and host as a 'context' that only these settings apply 
# Must use Git v1.8.5+ for these contexts to work
[http "https://your.domain.com"]
  ##################################
  # Self Signed Server Certificate #
  ##################################

  # MUST be PEM format
  # Some situations require both the CAPath AND CAInfo 
  sslCAInfo = /path/to/selfCA/self-signed-certificate.crt
  sslCAPath = /path/to/selfCA/
  sslVerify = true

  ###########################################
  # Private Key and Certificate information #
  ###########################################

  # Must be PEM format and include BEGIN CERTIFICATE / END CERTIFICATE, 
  # not just the BEGIN PRIVATE KEY / END PRIVATE KEY for Git to recognise it.
  sslCert = /path/to/privatekey/myprivatecert.pem

  # Even if your PEM file is password protected, set this to false.
  # Setting this to true always asks for a password even if you don't have one.
  # When you do have a password, even with this set to false it will prompt anyhow. 
  sslCertPasswordProtected = 0

参照:

git clone-ing時に構成を指定

リポジトリごとに適用する必要がある場合、ドキュメントは単に実行するように指示します git config --local、リポジトリディレクトリでれています。ローカルでクローンされたレポをまだ取得していない場合、これは役に立ちません。

global -> local上記のようにグローバル構成を設定することでhokey-pokeyを実行し、複製したらこれらの設定をローカルリポジトリ構成にコピーできます...

または、できることは、複製されたターゲットリポジトリに適用される構成コマンドを指定するgit cloneことです。

# Declare variables to make clone command less verbose     
OUR_CA_PATH=/path/to/selfCA/
OUR_CA_FILE=$OUR_CA_PATH/self-signed-certificate.crt
MY_PEM_FILE=/path/to/privatekey/myprivatecert.pem
SELF_SIGN_CONFIG="-c http.sslCAPath=$OUR_CA_PATH -c http.sslCAInfo=$OUR_CA_FILE -c http.sslVerify=1 -c http.sslCert=$MY_PEM_FILE -c http.sslCertPasswordProtected=0"

# With this environment variable defined it makes subsequent clones easier if you need to pull down multiple repos.
git clone $SELF_SIGN_CONFIG https://mygit.server.com/projects/myproject.git myproject/

一発ギャグ

編集:2.14.x / 2.15からこの1つのライナーまでの特定のgitバージョンの絶対パスと相対パスに関する警告を指摘するVonC回答を参照してください

git clone -c http.sslCAPath="/path/to/selfCA" -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" -c http.sslVerify=1 -c http.sslCert="/path/to/privatekey/myprivatecert.pem" -c http.sslCertPasswordProtected=0 https://mygit.server.com/projects/myproject.git myproject/

CentOS unable to load client key

あなたがCentOSでこれを試していて、あなたの.pemファイルがあなたに与えているなら

unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"

次に、このStackOverflowの回答についてcurl、Open SSLの代わりにNSSを使用する。

そして、あなたはソースから再構築curlたいでしょう:

git clone http://github.com/curl/curl.git curl/
cd curl/
# Need these for ./buildconf
yum install autoconf automake libtool m4 nroff perl -y
#Need these for ./configure
yum install openssl-devel openldap-devel libssh2-devel -y

./buildconf
su # Switch to super user to install into /usr/bin/curl
./configure --with-openssl --with-ldap --with-libssh2 --prefix=/usr/
make
make install

libcurlが共有ライブラリとしてメモリに残っているため、コンピュータを再起動します

Python、pip、conda

関連Windowsでpipが使用するCAストアにカスタムCAルート証明書を追加する方法


Gitがそれを受け入れる前に、自己署名サーバー証明書がPEM形式であることを確認する必要がありました。また、上記の回答の一部は、を使用して証明書のフォルダへのパスを指定するだけでよいことを示していますhttp.sslCAPath。私の場合、http.sslCAInfo特定のファイルを指定するために使用する必要がありました。これにより、GitはSSL検証を無効にすることなくプライベートGitHubに接続できます。
Zarepheth 2017年

@Zarephethその情報をありがとう。CAPathとCAInfoの両方を必要とする同じ問題に遭遇しました。私たちのCA証明書はPEM形式だったので、それを文書化するのを見過ごしていました。私はこれらの追加で答えを更新しました。安全に接続できて良かったです。
ジョシュピーク

HTTPSを使用してクローンを作成する必要があり、SSHを使用して証明書の混乱を回避できない場合は、これがおそらく最良の長期的な「修正」回答です。
dragon788

私はこの答えを追加しようとしていました!他の誰かがすでにそれを発見したことをうれしく思います。
フランクリンユー

14

私はこの問題に遭遇し続けるので、サーバーから自己署名証明書をダウンロードして〜/ .gitcertsにインストールするスクリプトを記述し、これらの証明書を指すようにgit-configを更新します。これはグローバル構成に保存されるため、リモートごとに1回実行するだけで済みます。

https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh


いいですが、グローバルの代わりにローカル設定を使用するオプションがあるほうがいいでしょう。
Adam Spiers

3
いつでもフォークして--globalオプションを削除できます;-)
Craig

これはかなり素晴らしいです、それはバッチで来ますか?
ホルター

10

この回答は、Michael Kauffmanが作成したこの記事から抜粋したものです。

企業のSSL証明書でGit for Windowsを使用する

発行

企業のSSL証明書があり、コンソールまたはVSCodeからリポジトリを複製する場合は、次のエラーが発生します。

致命的: ' https:// myserver / tfs / DefaultCollection / _git / Proj / ' にアクセスできません:SSL証明書の問題:ローカル発行者証明書を取得できません

ソリューション

  1. ルート自己署名証明書をファイルにエクスポートします。これは、ブラウザー内から行うことができます。

  2. gitフォルダーで「ca-bundle.crt」ファイルを見つけます(現在のバージョンはC:\ Program Files \ Git \ usr \ ssl \ certsですが、以前は変更されています)。ファイルをユーザープロファイルにコピーします。VSCodeなどのテキストエディターでファイルを開き、エクスポートした証明書の内容をファイルの最後に追加します。

次に、新しいファイルを使用するようにgitを構成する必要があります。

git config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt

これにより、ユーザープロファイルのルートにある.gitconfigファイルに次のエントリが追加されます。

[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt


1
ありがとう、私はこの答えがWindowsの方が簡単で安全だと感じました。
Pisu

7

特定のリポジトリのSSL検証を無効にするにはリポジトリが完全に制御下にある場合は、以下を試すことができます。

 git config --global http.sslVerify false

3

Josh Peak回答のように、sslKeyまたはsslCertを使用して1つのライナーを使用する場合は注意してください。

git clone -c http.sslCAPath="/path/to/selfCA" \
  -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" \
  -c http.sslVerify=1 \
  -c http.sslCert="/path/to/privatekey/myprivatecert.pem" \
  -c http.sslCertPasswordProtected=0 \
https://mygit.server.com/projects/myproject.git myproject

Git 2.14.x / 2.15(2015年第3四半期)のみがパスを~username/mykey正しく解釈できます(ただし、絶対パスを次のように解釈できます)。/path/to/privatekey)。

Junio C Hamano()によるcommit 8d15496(2017年7月20日)を参照してください。 協力者:Charles Bailey((合併によりJunio C浜野- -17b1e1dコミット 2017年8月11日)gitster
hashpling
gitster

http.chttp.sslcerthttp.sslkey両方がパス名です

29508e1でさまざまなhttp。*オプションを解析するために最新のhttp_options()コードパスが作成されたとき(「共有HTTP要求機能の分離」、2005-11-18、Git 0.99.9k)、その後、複数の間の相互作用について修正されました内の構成ファイル7059cd9 (「http_init():修正設定ファイルの解析」、2009年3月9日には、Gitの1.6.3-RC0)は、我々は次のように設定変数を解析されhttp.sslkeyhttp.sslcertので、プレーンバニラ文字列としてgit_config_pathname()それが「理解します~[username]/接頭辞が存在しませんでした』。

後で、それらの一部(つまりhttp.sslCAPathおよびhttp.sslCAInfo)を関数http.cookeyFile http.pinnedpubkeyを使用するように変換し、関数を最初から使用するように変数を追加しました。そのため、これらの変数はすべて理解します "~[username]/ "プレフィックスをます。

残りの2つの変数http.sslcerthttp.sslkeyを作成します。どちらもファイルへのパス名であるため、規則にも注意してください。


3

Windowsで64ビットバージョンのGitを使用して、これらのファイルに自己署名CA証明書を追加します。

  • C:\ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.crt
  • C:\ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.trust.crt

それが単なるサーバー自己署名証明書の場合は、

  • C:\ Program Files \ Git \ mingw64 \ ssl \ cert.pem

これは、すべてのHTTPSトラフィックに再署名する当社のファイアウォールに対処する最良の方法でした。ファイアウォール証明書のPEM形式のcrtファイルをテキストとして取得し、それをコピーしてca-bundleに貼り付けただけで、魅力的に動作します。
Mitten.O

3

ウイルス対策とファイアウォールの設定を確認します。

ある日から次の日まで、gitは機能しなくなりました。上記のことから、カスペルスキーが自己署名のアンチウイルス個人ルート証明書を途中に置いていることがわかりました。上記の手順に従ってGitに証明書を受け入れさせることができませんでした。私はあきらめました。私にとってうまくいくのは、暗号化された接続をスキャンする機能を無効にすることです。

  1. カスペルスキーを開く
  2. 設定>追加>ネットワーク>暗号化された接続をスキャンしない

この後、gitはsslVerifyを有効にして再び動作します。

注意。私のアンチウイルスの機能を有効にしたいので、これはまだ私には満足できません。詳細設定では、カスペルスキーはその機能で動作しないWebサイトのリストを表示します。Githubはそれらの1つとしてリストされていません。Kasperskyフォーラムで確認します。いくつかのトピックがあるようです。例:https : //forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211



1

私はそれをこのようにします:

git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git

3
使用しないでください--global!多くのチュートリアルが表示されます--globalが、一般的にhttp.sslVerify、特に非常に悪い考えです。コンピューター上でさまざまなプロジェクト、会社、チームからのクローンが複数あると、すぐに問題が発生します。たとえば、あるプロジェクトから次のプロジェクトにユーザーIDと電子メールが漏洩することは、非常に恥ずかしいことがあります。また、--globalon を使用http.sslVerifyすると、あらゆる種類のセキュリティ問題に直面する可能性があります。そのため、使用しないでください--global。副作用を十分に認識していて、リスクを取る準備ができている場合を除きます。
マーティン

1

Windowsではこれは私にとってうまくいきました:

自己署名証明書の内容をca-bundleファイルの最後に追加します。含む-----証明書をBEGIN ---------- END CERTIFICATE -----

ca-bundleファイルの場所は通常C:\ Program Files \ Git \ mingw64 \ ssl \ certsです

その後、ca-bundleファイルのパスをグローバルgit構成に追加します。次のコマンドでうまくいきます。git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

備考:パスはca-bundleファイルのローカルパスに依存します!


1

私はWindowsマシンを使用していますが、この記事が役に立ちました。基本的に私はメモ帳でca-bundle.crtを開き、それにチェーン証明書を追加しました(それらすべて)。この問題は通常、システムとgitリポジトリの間に中間者がいる企業ネットワークで発生します。ベース64形式のリーフ証明書を除くすべての証明書を証明書チェーンにエクスポートし、それらすべてをca-bundle.crtに追加して、この変更されたcrtファイル用にgitを構成する必要があります。


1

http.sslVerifyをfalseに設定することはお勧めできません。代わりに、SSL証明書を使用できます。

そのため、ビルドエージェントは認証にSSL証明書とPATを使用してhttpsを使用します。 ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

–begin—および–end--を含むcerファイルの内容をコピーします。

ビルドエージェントのgit bash => git config –global http.sslcainfo「C:/ Program Files / Git / mingw64 / ssl / certs / ca-bundle.crt」このファイルに移動して、.cerの内容を追加します。

したがって、ビルドエージェントはSSL証明書にアクセスできます


0

私の答えは遅いかもしれませんが、それは私のために働いた。それは誰かを助けるかもしれません。

上記の手順を試しても問題は解決しませんでした。

これを試してgit config --global http.sslVerify false

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