GitHubへのgit clone/pull/push時にSSL証明書まわりでエラーが出るときの本当に正しい対処法

# SSLまわりのエラーでGitHubに繋がらないときのおはなし

たとえば 以下のようなエラーメッセージでGitHubにhttps接続できなくなったときの対処法です。

```console
$ git clone https://github.com/karno/Cadena
Cloning into 'Cadena'...
fatal: unable to access 'https://github.com/karno/Cadena/': SSL certificate problem: self signed certificate in certificate chain
exit status 128
```

# TL;DR

**気軽に `$ git config --global http.sslVerify false` するな💢**

今回のおはなしは要するにこれ→ https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/646
KasperskyのWeb保護をオンにしているのであれば今すぐオフにしましょうというお話でした。

やったこと: 

- gitを最新版にアップグレードする
- opensslを使って `$ openssl s_client -connect www.github.com:443` して問題の証明書を見る(今回の場合)

以降、どうやってこれにたどり着いたかの備忘録です。

# Step 1. gitから事情聴取

gitが叫んでいる通り、、エラーとしては`SSL certificate problem: self signed certificate in certificate chain` 以外の何者でもありませんが、もう少しお話を詳しく聞いてみましょう。
しばらくgitをアップデートしていなかったのを思い出して、まずは最新版をインストールし直し。
以降、Windows 10 x64での git 2.19.1, openssl 1.1.1 でお話を進めます。

GIT_CURL_VERBOSE=1 してからcloneすると、gitの通信周りの詳細なログが得られます。

```console
$ set GIT_CURL_VERBOSE=1
$ git clone https://github.com/karno/Cadena
Cloning into 'Cadena'...
* Couldn't find host github.com in the _netrc file; using defaults
*   Trying 192.30.255.112...
* TCP_NODELAY set
* Connected to github.com (192.30.255.112) port 443 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
  CApath: none
* SSL certificate problem: self signed certificate in certificate chain
* Closing connection 0
fatal: unable to access 'https://github.com/karno/Cadena/': SSL certificate problem: self signed certificate in certificate chain
exit status 128
```

だいたいの通信エラーはここで得られる情報が頼りになるかと思いますが、今回はうまいこといきません。

# Step 2. OpenSSLから事情聴取

グーグル先生に聞いてみると以下のURLが頼りになりそうです。

https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/646

これに倣って、opensslで聞いてみます。

```console
$ openssl s_client -connect www.github.com:443
CONNECTED(00000148)
depth=1 O = AO Kaspersky Lab, CN = Kaspersky Anti-Virus Personal Root Certificate
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
 0 s:businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Delaware, serialNumber = 5157550, C = US, ST = California, L = San Francisco, O = "GitHub, Inc.", CN = github.com
   i:O = AO Kaspersky Lab, CN = Kaspersky Anti-Virus Personal Root Certificate
 1 s:O = AO Kaspersky Lab, CN = Kaspersky Anti-Virus Personal Root Certificate
   i:O = AO Kaspersky Lab, CN = Kaspersky Anti-Virus Personal Root Certificate
...以下略...
```

OK、わかりました。そういえばこないだ Kaspersky Internet Security を再インストールしたんでした。

# Step 3. GitHubを使えなくしてくれてありがとうKaspersky

Kasperskyはデフォルト機能で✞きれいなMITM✞を仕掛けてくるんですけど、💀きれいなMITM💀だけあって解除法は用意されているので設定しておきましょう。

設定→詳細→ネットワーク から、「暗号化された接続のスキャン」を「暗号化された接続をスキャンしない」に設定、でOKなようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3992/c71cf2c3-dcfc-5767-ee56-0193d418648c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3992/2b25efad-a429-b03c-8311-059166b3b5fa.png)

# Final Step. 問題は解決したか？

コンソールを再度立ち上げ直し、様子を見てみます。

```console
$ git clone https://github.com/karno/Cadena
Cloning into 'Cadena'...
remote: Enumerating objects: 1727, done.
remote: Total 1727 (delta 0), reused 0 (delta 0), pack-reused 1727 eceiving objects:  97% (1676/1727), 188.01 K
Receiving objects: 100% (1727/1727), 471.64 KiB | 632.00 KiB/s, done.
Resolving deltas: 100% (1314/1314), done.
```

大丈夫そうです。


# いいですか

世の中の記事では `$ git config --global http.sslVerify false` しろとか

```ini
[http]
   sslVerify = false
```

しろとか書いていますが、こういったものを簡単にオフにしてはいけません。
あなたも技術者の端くれなら、真因を調べるクセを身に着けましょう。

そしてカスペルスキーは反省するように。