Visual Studio 2019 version 16.6 にアップデートすると "schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) " エラーが発生してリポジトリにアクセスできない現象について紹介します。
Visual Studio 16.6 にアップデート後にリポジトリの同期やプッシュで以下のエラーが発生します。
文字化けしている部分は以下のメッセージとなっているようです。
Visual Studio のアップデートで Git のバージョンもアップデートされ、接続モードが schannel になったことが影響していると考えられます。
schannel 接続ではなくopenssl接続に変更すると解消されることがあります。gitconfig ファイルを変更します。
[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
[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ディレクトリは以下になります。
エクスプローラで開くと、gitconfigファイルが、リネームされていることがわかります。ちなみに新規インストールした場合は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 を利用する接続になってしまっています。
[http]
sslBackend = schannel
[diff "astextplain"]
textconv = astextplain
[credential]
helper = manager
[core]
autocrlf = true
fscache = true
symlinks = true
Visual Studio の gitconfig に[include]
セクションがあり、そこで Git for Windowsのgitconfigファイルをインクルードしていることがわかりました。
別の対策方法としては、Visual Studio の gitconfig の[include]
セクションをコメントアウトして、Git for Windows の設定をインクルードしないようにします。
下記パスの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
[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
Git for Windows をインクルードする仕組みは残し、Git for Windows 側のgitconfigを修正する方法もあります。
この場合、gitconfig は変更せずに C:/Program Files/Git/etc/gintconfig
のschannel 設定を openssl に変更します。
[http]
sslBackend = schannel
[diff "astextplain"]
textconv = astextplain
[credential]
helper = manager
[core]
autocrlf = true
fscache = true
symlinks = true
指定のリポジトリにアクセスする際に openssl 接続で指定した証明書を利用する設定としました。
[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
証明書はこれまでと同じ位置に配置しています。