サーバー証明書の検証に失敗しました。CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:なし


333

sshを使用してプロジェクトを複製してプッシュすることはできますが、httpsでプロジェクトを複製すると機能しません。

私を示すエラーメッセージは次のとおりです。

server certificate verification failed. CAfile: /etc/ssl/certs/cacertificates.crt CRLfile: none

回答:


421

TLDR:

hostname=XXX
port=443
trust_cert_file_location=`curl-config --ca`

sudo bash -c "echo -n | openssl s_client -showcerts -connect $hostname:$port -servername $hostname \
    2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'  \
    >> $trust_cert_file_location"

長い答え

基本的な理由は、Gitlabサーバーで使用される証明書に署名した認証コンピューターが信頼していないためです。これは、証明書が疑わしいという意味ではありませんが、自己署名されているか、OSのCAのリストにない機関/会社によって署名されている可能性があります。コンピューターの問題を回避するために必要なことは、その証明書を信頼するように指示することです-疑わしい理由がない場合。

gitLabサーバーで使用されているウェブ証明書を確認し、それをに追加する必要があります</git_installation_folder>/bin/curl-ca-bundle.crt

上記の証明書確認せずに少なくともクローンが機能するかどうかを確認するには、次のように設定します。

export GIT_SSL_NO_VERIFY=1
#or
git config --global http.sslverify false

ただし、「SSLはブラウザ、wget、curlで機能するが、gitでは失敗する」またはこのブログ投稿で説明されているように、これはテスト専用です。

GitLabの設定を確認します(問題4427)


curl-ca-bundle.crtファイルに追加する必要がある)証明書を取得するには、次のように入力します。

echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpsGitlabPort \
  2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

( ' yourserver.com'はGitLabサーバー名でYourHttpsGitlabPort、通常はhttpsポートです443

CA(認証局発行者)を確認するには、次のように入力します。

echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpsGilabPort \
  2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \
  | openssl x509 -noout -text | grep "CA Issuers" | head -1

注:Valeriy Katkov はコメントで-servername opensslコマンドにオプションを追加することを提案しています。そうでない場合、Valeriyの場合、コマンドはwww.github.comの証明書を表示しません。

openssl s_client -showcerts -servername www.github.com -connect www.github.com:443

Findekanoコメントに追加します

の場所を特定するにはcurl-ca-bundle.crt、次のコマンドを使用できます

curl-config --ca

また、私の最近の回答「github:サーバー証明書の検証に失敗しました」を参照してください:これらの証明書を再インストールする必要があるかもしれません:

sudo apt-get install --reinstall ca-certificates
sudo mkdir /usr/local/share/ca-certificates/cacert.org
sudo wget -P /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt
sudo update-ca-certificates
git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt

8
元のメッセージは、証明書を追加する場所を示していませんか?私の場合curl-config --caはを返しまし/etc/ssl/certs/ca-certificates.crtたが、ここに証明書を追加する必要がありました。それとは別に、この回答は、この問題について私を正しい方向に向ける最初の情報でした
uli_1973

1
gitインストールフォルダーはどのようにして見つけますか?
Bhargav

1
@BhargavそれはあなたのOSに依存します。Linuxでは、を実行できますwhich git
VonC、2016年

3
私は走ったcurl-config --caが何も返されなかった。
フェルナンドコスタ

1
ヒントをありがとう-あなたは私の日を救った。
ジャンヌ

218

注:これには、セキュリティ上の大きな影響があります。

端末を開き、次のコマンドを実行します。

export GIT_SSL_NO_VERIFY=1

それは私のために動作し、私はLinuxシステムを使用しています。


60
自分が何をしているのかわかっているときの回避策なので、反対票を投じないでください。ただし、一般的なケースではこれを行わないことを強くお勧めします。
tripleee 2014年

9
あなたがあなたが何をしているのか知っているとき、私はそれが回避策であるとは言いません。何をしているのかがわかっている場合は、「誰かが私たちをハッキングしたのではなく」と失敗した証明書を見てください。何かができるだけ早くプッシュされる必要がある場合、それはせいぜい一時的な措置です。
srcspider

1
上記のフラグをエクスポートすると、以下のエラーが発生します。エラー:RPCが失敗しました。結果= 22、HTTPコード= 403致命的:リモートエンドが突然ハングアップエラー:RPCが失敗しました。結果= 22、HTTPコード= 403致命的:リモートエンドが予期せずハングアップした
Desu

7
私とのみ一緒に働いたgit config --global http.sslverify false
Dinei

2
すごい。あなたは私の時間を節約しました。
Sai prateek 2017年

146

この問題のもう1つの原因は、時計がずれている可能性があります。証明書は時間に敏感です。

現在のシステム時刻を確認するには:

date -R

NTPをインストールして、システム時刻をグローバルNTPプールの信頼できるインターネットタイムサーバーと自動的に同期することを検討してください。たとえば、Debian / Ubuntuにインストールするには:

apt-get install ntp

5
これが私の問題でした。私の大学はntpパケットをブロックしていたため、システムが時間を更新できませんでした。大学のntpサーバーを構成すると、問題が解決しました。このヒントをありがとう!
カイル

3
これも私の問題の原因でした。間違った日付の組み込みデバイスを使用していました。
Shervin Emami、

これは、証明書に関する私の問題でした。私は何時間もかけてあらゆる種類のソリューションを検討しましたが、問題はサーバークロックが将来に向けて設定されていることにありました。ただし、Node.jsの将来のリリースを取得するのに役立ちませんでした。:-(
Kevin Teljeur 2017年

1
@Katuそれはgit言うまでもありません、それは根本的なSSL交換です。GitはSSLサポートを使用して構築されています。
Yvan 2017

1
私はこれを10000回賛成すると思います...なぜ6時間も機能しなかった理由を調べていました...サーバーの停止時間が7分未満で、これで問題が解決しました...ありがとうございます!
dGo 2018年

66

プライベートネットワーク内でgitサーバーを使用していて、自己署名証明書またはIPアドレスを介した証明書を使用している場合。gitグローバル設定を使用して、SSLチェックを無効にすることもできます。

git config --global http.sslverify "false"

43

同じ問題がありました。自己発行の認証局が原因です。.pemファイルを/ usr / local / share / ca-certificates /に追加 して呼び出すことで解決しました

sudo update-ca-certificates

PS:./share/ca-certificatesフォルダー内のpemファイルには拡張子.crtが必要です


2
Linux mint 16の魅力のように動作しました:)
greuze 14

cert.pemまたはcert.crtまたはcert.pem.crtを意味しますか?
Moses Liao GZ

1
cert.pemの名前をcert.pem.crtに変更する必要があります
Nikolay Ruban

34

システムクロックを確認します。

$ date

正しくない場合、証明書チェックは失敗します。システムクロックを修正するには、

$ apt-get install ntp

時計はそれ自体を同期させる必要があります。

最後に、もう一度cloneコマンドを入力します。


1
はい!私は長い間、VirtualBoxでUbuntuのインスタンスを中断していました。一時停止を解除すると、なんらかの理由でシステムクロックが同期しませんでした。VonCの回答は精通しているようですが、理解できない一連のセキュリティコマンドを実行する必要がなかったことを本当に嬉しく思います。まずこれをチェック!
AndyJost

24
GIT_CURL_VERBOSE=1 git [clone|fetch]…

問題がどこにあるかを教えてください。私のケースでは、NSSに対して構築時にカールが原因そのサポートはNSSでメインライン(されないように、PEM証明書をサポートしていないためであった#726116 #804215 #402712 および より)。


4
素敵な追加GIT_CURL_VERBOSE。私はそれを私の答えで述べなかった。+1
VonC 2014

18

または、次のコメントを実行して、サーバー証明書をデータベースに追加します。

echo $(echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpGilabPort 2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p') >> /etc/ssl/certs/ca-certificates.crt

次に、もう一度git cloneを実行します。


1
これが誰にとっても機能するかどうかはわかりませんが、証明書ファイルをrootとして追加するには「Tee」が必要です。openssl s_client -showcerts -connect yourserver.com:443 2> / dev / null | sed -ne '/ -BEGIN CERTIFICATE-/、/-END CERTIFICATE- / p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
ywu

私の場合、サーバーには有効な証明書がありますが、データベースには含まれていません。このコマンドで解決しましたが、このコマンドはroot権限で実行する必要があると言わなければなりません。
hermeslm 2018年

10

goagentプロキシをセットアップしているときに、CAファイルをめちゃくちゃにしました。githubからデータをプルできず、同じ警告が表示されます:

サーバー証明書の検証に失敗しました。CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:なし

Voncの方法を使用し、githubから証明書を取得して、/ etc / ssl / certs / ca-certificates.crtに配置します。問題は解決しました。

エコー-n | openssl s_client -showcerts -connect github.com:443 2> / dev / null | sed -ne '/ -BEGIN CERTIFICATE-/、/-END CERTIFICATE- / p'


8

git ssl validationをfalseに設定する必要はありません。これは、システムにすべてのCA権限証明書がない場合に発生します。ほとんどの場合、本物のSSL証明書を持っている人が中間証明書を失っています。

中間証明書の完全なテキスト(欠落しているCAおよび中間証明書のチェーン全体)を追加するだけ

sudo gedit /etc/ssl/certs/ca-certificates.crt 

を実行せずに動作しupdate-ca-certificatesます。

手動で生成した証明書についても同様です。CA証明書のテキストを追加するだけです。

最後に:プッシュ成功:すべてが最新です


1
サーバーがすべてのSSL CAチェーンで正しく構成されていない場合にも、同じことが発生する可能性があります。
abcdef12 2015

abcdef12がコメントしたように、チェーンの問題が原因である可能性があります。私はgit 1.9.1でこの問題が発生しました-サーバーが証明書チェーンを送信していました:#0 server cert; #1サーバー証明書(ここでも); #2署名者証明書。チェーンの重複がgitが気に入らなかった理由です。
2016年

8

ターミナル(Ubuntu 18.04)でこの問題を解決するために私がしたこと:

openssl s_client -showcerts -servername www.github.com -connect www.github.com:443

証明書チャンクを2つ取得しました。そして、証明書チャンクを私の証明書ファイルにコピーしました/etc/ssl/certs/ca-certificates.crt


このソリューションは、Ubuntu 16.04での私の同じ問題を解決します。
user3072843

certificatチャンクとは正確にはどういう意味ですか?間のブロック---BEGIN CERTIFICATE------ END CERTIFICATE ---
B--rian

3

XubuntuをRaspberry pi 2にインストールしましたが、NTPと自動サーバー同期がオフ(またはインストールされていない)だったため、時間の経過とともに同じ問題が見つかりました。NTPを取得

sudo apt-get install ntp

そして、「時刻と日付」を「手動」から「インターネットサーバーと常に同期」に変更します


1

最終的に、http.sslverifyを.git / configに追加します。

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = https://server/user/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[http]
        sslVerify = false

1
コマンドラインを使用する方が良いgit config http.sslVerify false。@ romain-vdkによって提案されたグローバルではなく、リポジトリごとにGit構成を編集することを提案していますか?
ahogen

1

最初に確認する必要があるのは、/etc/sslおよびのファイル権限です/etc/ssl/certs

Certificate Authority Management Toolで作業しているrm -rf /etc/ssl/*ときにssl-certグループ名/ IDを使用すると、ファイルのアクセス権を削除する(またはSSL ディレクトリを削除する)ミスを犯しました。

次に、wgetcurlCLIブラウザツールのまったく同じエラーメッセージに気づきました。

server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

私が持ったら/etc/ssl/etc/ssl/certにディレクトリファイルパーミッションをo+rx-w少し簡単に息を開始し、それらのCLIブラウザのツール、:

mkdir -p /etc/ssl/certs
chmod u+rwx,go+rx /etc/ssl /etc/ssl/certs

また、Javaサブディレクトリを再作成し、信頼できるCA証明書ディレクトリを再構築する必要がありました。

mkdir /etc/ssl/certs/java
chmod u+rwx,go+rx /etc/ssl/certs/java
update-ca-certificates

そして海岸は澄んでいた。


0

私はいつも私のために働くgitリポジトリで非常に同じ問題に遭遇しました。問題は、最初の接続時にキャプティブポータルにリダイレクトするパブリックWiFiアクセスを通じてアクセスしたことでした(たとえば、広告を表示してtosに同意するため)。


0

証明書とバンドルを1つの.crtファイルにコピーし、ファイル内の証明書の間に空白行があることを確認します。

これは、インターネットですべてを試した後、GitLabサーバーで私にとってうまくいきました。

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