Visual Studio 2019 version 16.6 にアップデートすると "schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) " エラーが発生してリポジトリにアクセスできない - Visual Studio

Visual Studio 2019 version 16.6 にアップデートすると "schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) " エラーが発生してリポジトリにアクセスできない現象について紹介します。

現象

Visual Studio 16.6 にアップデート後にリポジトリの同期やプッシュで以下のエラーが発生します。
エラーメッセージ
Git failed with a fatal error.
unable to access '(リポジトリのURL)': schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) - �����T�[�o�[���I�t���C���̂��߁A�����̊֐��͎�����m�F�ł��܂���ł����B


文字化けしている部分は以下のメッセージとなっているようです。
エラーメッセージ
Git failed with a fatal error.
unable to access '(リポジトリのURL)': schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) - The revocation function was unable to check revocation for the certificate.

原因

Visual Studio のアップデートで Git のバージョンもアップデートされ、接続モードが schannel になったことが影響していると考えられます。

対処法 : 従来の接続 openssl に変更する

schannel 接続ではなくopenssl接続に変更すると解消されることがあります。gitconfig ファイルを変更します。

リポジトリ内のローカルconfigの場合

変更前 : リポジトリ/.git/config
[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[http "(リモートリポジトリのホスト)"]
	sslCAinfo = /ssl/certs/iPentec-CA-ACA.cer
[submodule]
	active = .
[remote "origin"]
	url = (リモートリポジトリのURL)
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
変更前 : リポジトリ/.git/config
[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[http "(リモートリポジトリのホスト)"]
	sslCAinfo = /ssl/certs/iPentec-CA-ACA.cer
	sslBackend = openssl
[submodule]
	active = .
[remote "origin"]
	url = (リモートリポジトリのURL)
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master

http セクション内に sslBackend = openssl を追記します。

原因調査

アップデートで動作しなくなった原因を調査します。
まず、gitconfig ディレクトリを確認します。Visual Studio 2019 の場合gitconfigディレクトリは以下になります。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\etc
エクスプローラで開くと、gitconfigファイルが、リネームされていることがわかります。ちなみに新規インストールした場合はetcフォルダ自体が作成されません。

新しいgitconfigファイルの位置を探したところ、こちらのフォルダに移動していました。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\etc

このフォルダのgitconfigを開くと、以下がデフォルトの設定となっています。

gitconfig
[core]
	symlinks = false
	autocrlf = true
[color]
	diff = auto
	status = auto
	branch = auto
	interactive = true
[pack]
	packSizeLimit = 2g
[help]
	format = html
[http]
	sslCAinfo = /ssl/certs/ca-bundle.crt
[diff "astextplain"]
	textconv = astextplain
[rebase]
	autosquash = true
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[include]
	; include Git for Windows' system config in order
	; to inherit settings like `core.autocrlf`
	path = C:/Program Files (x86)/Git/etc/gitconfig
	path = C:/Program Files/Git/etc/gitconfig

末尾に[include]セクションがあり、別途インストールされている Git for Windows の gitconfigファイルをインクルードする設定になっています。
Visual Studio のみをインストールした場合は、Git for Windows がインストールされていないため、影響はありませんが、Git for Windows をインストールしてある場合は、Git for Windows 側のgitconfig もインクルードしてしまいます。
問題が発生したPCではGit for Windows がインストールされており、C:/Program Files/Git/etc/gitconfig の内容は以下でした。
sslBackend が schannlel に設定されています。このため、Visual Studio のGitもschannel を利用する接続になってしまっています。
gitconfig (C:/Program Files/Git/etc)
[http]
	sslBackend = schannel
[diff "astextplain"]
	textconv = astextplain
[credential]
	helper = manager
[core]
	autocrlf = true
	fscache = true
	symlinks = true

対策2 : Visual Studio の gitconfig のインクルードをコメントアウトする

Visual Studio の gitconfig に[include]セクションがあり、そこで Git for Windowsのgitconfigファイルをインクルードしていることがわかりました。 別の対策方法としては、Visual Studio の gitconfig の[include]セクションをコメントアウトして、Git for Windows の設定をインクルードしないようにします。
下記パスのgitconfig ファイルを修正します。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\etc\gitconfig
gitconfig (変更前)
[core]
	symlinks = false
	autocrlf = true
[color]
	diff = auto
	status = auto
	branch = auto
	interactive = true
[pack]
	packSizeLimit = 2g
[help]
	format = html
[http]
	sslCAinfo = /ssl/certs/ca-bundle.crt
[diff "astextplain"]
	textconv = astextplain
[rebase]
	autosquash = true
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[include]
	; include Git for Windows' system config in order
	; to inherit settings like `core.autocrlf`
	path = C:/Program Files (x86)/Git/etc/gitconfig
	path = C:/Program Files/Git/etc/gitconfig
gitconfig (変更後)
[core]
	symlinks = false
	autocrlf = true
[color]
	diff = auto
	status = auto
	branch = auto
	interactive = true
[pack]
	packSizeLimit = 2g
[help]
	format = html
[http]
	sslCAinfo = /ssl/certs/ca-bundle.crt
[diff "astextplain"]
	textconv = astextplain
[rebase]
	autosquash = true
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[include]
	; include Git for Windows' system config in order
	; to inherit settings like `core.autocrlf`
	; path = C:/Program Files (x86)/Git/etc/gitconfig
	; path = C:/Program Files/Git/etc/gitconfig

対策3 : Git for Windows の gitconfig を修正する

Git for Windows をインクルードする仕組みは残し、Git for Windows 側のgitconfigを修正する方法もあります。 この場合、gitconfig は変更せずに C:/Program Files/Git/etc/gintconfig のschannel 設定を openssl に変更します。
gitconfig (C:/Program Files/Git/etc) 変更前
[http]
	sslBackend = schannel
[diff "astextplain"]
	textconv = astextplain
[credential]
	helper = manager
[core]
	autocrlf = true
	fscache = true
	symlinks = true

指定のリポジトリにアクセスする際に openssl 接続で指定した証明書を利用する設定としました。
gitconfig (C:/Program Files/Git/etc) 変更後
[http]
	sslBackend = schannel
[http "https://(リポジトリのホスト名)"]
	sslBackend = openssl
	sslCAinfo = /ssl/certs/iPentec-CA-ACA.cer
[diff "astextplain"]
	textconv = astextplain
[credential]
	helper = manager
[core]
	autocrlf = true
	fscache = true
	symlinks = true

証明書はこれまでと同じ位置に配置しています。
証明書の位置
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\ssl\certs
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2020-05-21
iPentec all rights reserverd.