git clone で fatal: unable to access 'https://...' schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) が出る時の対処方法

社内の GitLab に対して git clone すると

$ git clone https://...
Cloning into 'xxxxxx'...
fatal: unable to access 'https://...': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - ....

こんなエラーが出て clone できなかった。

既に対処したこと

プロキシはちゃんとできてる。インターネットからの clone は上手くいく。

以下 %userprofile%.gitconfig (global の gitconfig) の例。

[http]
    proxy = http://(プロキシサーバーのIP):(ポート番号)
[http "https://...(今回 clone したい gitlab サーバー)"]
    sslCAInfo=D://(gitlabサーバーの認証に必要なcerファイル).cer

また (gitlabサーバーの認証に必要なcerファイル).cer も Windows 証明書ストアにインストール済。実際ブラウザから gitlab は開ける。

対処方法

git の SSL 通信設定を openssl にする。

$ git config --system http.sslcainfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"
$ git config --system http.sslbackend openssl

これでエラーがでなくなった。

その他情報

結局なぜこれでエラーが出なくなったのかがわからない。Windows 証明書ストアにインストール済なんだから動くはずなんだが……。

とりあえず関連しそうな情報はまとめておく。

元々はどうなっていたか

sslcainfo は空値で、sslbackend は schannel だった。

$ git config --system http.sslcainfo
$ git config --system http.sslbackend
schannel

http.sslbackend って何?

SSL 認証としてどんな手段を使うか。

元々は openssl だけだったが、Git for Windows 2.14 からは http.sslbackend=schannel という新しいモードが使えるようになった。

schannel モードは、Windows にインストールされた証明書ストアを使って SSL 認証をするモード。証明書ストアにちゃんと証明書を入れてたら sslcainfo による crt ファイル指定が不要になる……という恩恵がある。

http.sslcainfo って何?

Git が openssl モードの時に SSL 通信で使う証明書。

基本的に Git に同梱された ca-bundle.crt が指定されてるはずなので、ここをいじることはたぶんない。

ただし Git for Windows 2.14 以降をインストールする時にウィザード画面で「schannel を使う」みたいな選択肢を選んでた場合は、上記したように schannel モードになる& --system http.sslcainfo が空値になる。

参考