社内GitLabなどをHTTPS化したあと、Windowsに社内CA証明書をインポートしたのに、Git for Windowsで clone / fetch / pull / push が失敗することがあります。
ブラウザではGitLabにアクセスできるのに、Gitコマンドでは以下のようなエラーになるケースです。
schannel: SEC_E_UNTRUSTED_ROOT
または、
SSL peer certificate or SSH remote key was not OK
この場合、Windowsに証明書を入れただけでは、Git側がその証明書を参照できていない可能性があります。
何が起きているのか
Git for WindowsのHTTPS通信では、TLS処理に使う仕組みとして主に次の2つがあります。
| TLSバックエンド | 参照する証明書 |
|---|---|
| Schannel | Windowsの証明書ストア |
| OpenSSL | Git/OpenSSL側の証明書設定 |
Windowsに社内CA証明書をインポートすると、Windowsの「信頼されたルート証明機関」に証明書が登録されます。
この証明書は、Schannelを使うアプリケーションから参照されます。
一方で、Git for WindowsのTLSバックエンドがOpenSSL側になっている場合、Windowsの証明書ストアではなく、Git/OpenSSL側の証明書設定を参照することがあります。
そのため、ブラウザでは問題なくアクセスできるのに、Gitコマンドでは証明書エラーになることがあります。
対応方針
Windowsにインポートした証明書をGit for Windowsから利用したい場合は、GitのTLSバックエンドを schannel に寄せるのが分かりやすいです。
以下を実行します。
git config --global http.sslBackend schannel
これで、Git for WindowsのHTTPS通信がWindows標準のSchannelを使うようになります。
Schannelを使うことで、Windowsの「信頼されたルート証明機関」にインポートした証明書が参照されます。
設定を確認する
設定結果は以下で確認できます。
git config --global --get http.sslBackend
以下のように表示されればOKです。
schannel
どの設定ファイルから読み込まれているかも確認したい場合は、以下を実行します。
git config --show-origin --get http.sslBackend
表示例です。
file:C:/Users/your-name/.gitconfig schannel
注意点
--global の設定は、コマンドを実行したWindowsユーザーにだけ適用されます。
たとえば、証明書のインポートを管理者ユーザーで行ったとしても、普段Gitを使うユーザーには git config --global の設定は反映されません。
必ず、普段Gitを使っているWindowsユーザーで以下を実行してください。
git config --global http.sslBackend schannel
TortoiseGitを使っている場合
TortoiseGitを使っている場合も、内部では指定された git.exe を使っています。
そのため、TortoiseGitが参照しているGit実行ファイルの設定が関係します。
TortoiseGitの設定画面で、以下を確認します。
TortoiseGit
→ Settings
→ General
→ Git.exe Path
たとえば、Git.exe Path が以下の場合を考えます。
C:\Program Files\Git\bin\git.exe
以下のコマンド例は、PowerShellで実行する場合の記法です。
PowerShellでは、スペースを含むパスの実行ファイルを呼び出すために、呼び出し演算子の & を使用します。
& "C:\Program Files\Git\bin\git.exe" config --show-origin --get http.sslBackend
必要であれば、同じ git.exe に対して schannel を設定します。
& "C:\Program Files\Git\bin\git.exe" config --global http.sslBackend schannel
コマンドプロンプト(cmd.exe)で実行する場合は、& を付けずに次のように実行します。
"C:\Program Files\Git\bin\git.exe" config --show-origin --get http.sslBackend
設定する場合も同様です。
"C:\Program Files\Git\bin\git.exe" config --global http.sslBackend schannel
やらない方がよい対応
証明書エラーを回避するために、以下のような設定を見かけることがあります。
git config --global http.sslVerify false
これは証明書の検証自体を無効化する設定です。
一時的にはエラーを回避できるかもしれませんが、セキュリティ上おすすめしません。
社内CA証明書をWindowsへ正しく登録したうえで、Git for WindowsのTLSバックエンドを schannel に設定する方が安全です。
まとめ
Windowsに証明書をインポートしても、Git for Windowsがその証明書を参照しているとは限りません。
Git for WindowsのTLSバックエンドがOpenSSL側になっている場合、Windowsの証明書ストアに入れた証明書が使われず、SSL証明書エラーになることがあります。
Windowsに登録した証明書をGit for Windowsから使いたい場合は、以下を設定します。
git config --global http.sslBackend schannel
社内GitLabなど、Windows端末に社内CA証明書を配布して使う環境では、Git for Windowsも schannel に寄せておくと運用しやすくなります。