はじめに
下記のエラーが発生し,Githubへのpushができなくなりました。
同じようなエラーが発生した方の参考になればと思います。
$ git push heroku master
fatal: unable to access 'https://git.heroku.com/省略.git/': error setting certificate verify locations:
CAfile: /etc/ssl/cert.pem
CApath: none
到達点
以下の2点を達成する
・エラーの原因を調べる
・エラーの対処を学ぶ
流れ
① エラー前に入力したコマンド
② 原因を調べる
③ cacert.pemをダウンロードする
① エラー前に入力したコマンド
$ CERT_PATH=$(ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE")
$ sudo curl "https://curl.haxx.se/ca/cacert.pem" -o $CERT_PATH
CERT_PATH
は、変数
OpenSSL::X509::DEFAULT_CERT_FILE
は、デフォルトのCA証明書ファイル名です。
"https://curl.haxx.se/ca/cacert.pem" をCERT_PATHに出力するコマンドを行ったところ、Githubへのpushができなくなりました。
② 原因を調べる
$ ls -al /private/etc/ssl
total 24
drwxr-xr-x 6 root wheel 192 1 1 2020 .
drwxr-xr-x 85 root wheel 2720 2 27 10:58 ..
-rw-r--r-- 1 root wheel 299 3 6 16:46 cert.pem
drwxr-xr-x 2 root wheel 64 1 1 2020 certs
-rw-r--r-- 1 root wheel 745 1 1 2020 openssl.cnf
-rw-r--r-- 1 root wheel 1006 1 1 2020 x509v3.cnf
cert.pemの存在を確認する
$ ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE"
/private/etc/ssl/cert.pem
ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE"によって、証明書の置き場所は/etc/ssl/cert.pemと分かります。
そして、/etc/ssl/cert.pemには、"https://curl.haxx.se/ca/cacert.pem" の内容が出力されています。
$ cat /private/etc/ssl/cert.pem
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://curl.se/ca/cacert.pem">here</a>.</p>
<hr>
<address>Apache Server at curl.haxx.se Port 80</address>
</body></html>
/etc/ssl/cert.pemには、 SSL証明書用の情報が記載されていました。
また、「301リダイレクト」の設定がされていていることがわかります。
以上のことからわかること3点
・ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE"では、/etc/ssl/cert.pemが返され、"https://curl.haxx.se/ca/cacert.pem" の内容が出力されています。
・https://curl.haxx.se/ca/cacert.pemというURLには「301リダイレクト」の設定がされている。これが原因だと推測します。
・sudo curl "https://curl.haxx.se/ca/cacert.pem" -o $CERT_PATH
というコマンドをすると、/etc/ssl/cert.pem ファイルに、証明書情報ではなくリダイレクトの情報が返される。
③ cacert.pemをダウンロードする
$ sudo wget https://curl.se/ca/cacert.pem
zsh: command not found: wget
$ brew install wget
$ sudo wget https://curl.se/ca/cacert.pem
新たにhttps://curl.se/ca/cacert.pem からダウンロードすると、Githubへのpushが可能になりました。
wgetが使えない場合は、installしてください。
学んだこと
以下の3点を行うと問題解決する糸口が見つかることを学びました。
「エラーメッセージをしっかり理解する」
「エラーメッセージで指定されているファイルなどを調べてみる」
「理解しないまま使っているコマンドの挙動を調べてみる」