(旧方法)pip, python [SSL: CERTIFICATE_VERIFY_FAILED] 対処方法

標記エラーが表示されpip installやpython -m download等でインストールできない時の、CA certificate証明書作成方法を紹介します。分かってしまえば簡単です。(Chrome証明書取得方法更新しました。)

しかし、簡単な方法は『(新)pip, python [SSL: CERTIFICATE_VERIFY_FAILED] 対処方法 2024.3.5』です。

準備・予備知識

DER形式からPEM形式に変換必要

アクセスしたいサイトからダウンロードした証明書はDER形式ですが、認識してもらうにはPEM形式に変換しなければなりません。(2024/3/5現在Chromeでは、この変換は不要になりました。) WSLもOpenSSLも不要なので、ここにジャンプしてください。

状況により手順が異なる

WinでWSL有の場合

下の順番で進めるのが一番いいと思います。

WinでWSL無しの場合

OpenSSLをインストールして、『証明書取得~PEM変換方法』に進むのが良いと思います。 WSLを設定してLinuxを扱うより。

Linuxの場合

OpenSSLが標準で入っているので一番簡単です。 『証明書取得~PEM変換方法』に進んでください。

WSL内のOpenSSLコマンドでDERからPEMに変換

Windowsの場合、WSL等のLinuxのOpenSSLコマンドでDERからPEMに変換しなければなりません。 (私の場合、WindowsのOpenSSLでも動作しました。  (2022/06/06) WindowsにはOpenSSLは入っていないので、Visual C++再配布パッケージをインストールして、そしてOpenSSLをインストールする必要があります。ここが分かりやすいです。 もし、WindowsのOpenSSLで動作しなければ、WindowsのOpenSSLでPEMに変換すると、改行コードがCR+LFになるので、改行コードをLFに置き替えればLinuxのOpenSSLで変換してPEMと全く同じになります。 『CR+LFからLFの置換方法』)

証明書ファイルの場所

Windowsの場合は、WSLをインストールして、形式を変換するダウンロードした証明書ファイルを、WSLがアクセスできるフォルダーに移動させる必要があるので、WSLのhomeディレクトリがどこか知っておく必要があります。(私の場合のhomeディレクトリはここでした。 (見つけれない時は、Explorerでrootfsを検索したらよいと思います。) 

C:\Users\ユーザー名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home

pip installとpython -mの対処法

  • pipコマンドでのエラーの場合は、pem証明書の場所(PATH)をpip.iniに書込む。
  • pythonコマンドでのエラーの場合は、pem証明書の中身を、cacert.pemに付加える。

–trusted-hostは危険

–trusted-host オプションでpipは回避できる事がありますが、python -m ライブラリ名 downloadでは出来ないし、–trusted-host オプションはセキュリティもちょっと怖いので、正しくCA証明書を入手した方が良いと思います。

証明書取得~PEM変換方法

エラー内容から通信しようとしてるサイトアドレスをコピーする。

私の場合は、以下赤線部分でした。 この部分のアドレスをコピーする。

そのサイトから証明書を取得する

ChromeとEdgeの場合(証明書取得方法が変更されてました)

  • 上記でコピーしたアドレスをブラウザのアドレスバーに貼り付けて、ENTERを押すとそのサイトが開く。(githubは自動的に、raw.githubusercontent.comがgithub.comに表示が変わりました。)
  • 『F12』を押して、デベロッパーモード(EdgeではDevTool)にはいる。
  • 『Security』を押して、『View certificate』をクリックする。
  • メニューが短いと『Security』が隠れてしまっているかもしれないので、その場合は『>>』をクリックして『Security』を表示する。

ChromeもEdgeも同じChromiumを使っているのでデベロッパーモードは同じですね。

日本語の場合も同じです。

  • 証明書のダイアログボックスが開いたら、『詳細』のタブをクリックする。
  • RootCA等、いくつも表示されるが、2の一番上のRoot CAをクリックして選択。
  • 『エクスポート』をクリックする
  • 『Base64エンコードASCII形式の単一の証明書』を選択して
  • .crtファイルを保存する
  • この.crtファイルは既にPEM形式なので、pip.iniにPATHを書くだけ。
  • 下を飛ばして、ここにジャンプしてください。

ここから下は以前の方法(備忘録)

  • 証明書のダイアログボックスが開いたら、1の『証明のパス』のタブをクリックする。
  • RootCA等、いくつも表示されるが、2の一番上のRoot CAをクリックして選択。
  • 3の『証明書の表示』をクリックする。
  • 『詳細タブ』をクリックする。
  • 『ファイルにコピー』をクリックする。
  • 『次へ』をクリックする
  • 『DER encoded binary X.509 (.CER)(D)』を選択する。
  • 『次へ』をクリックする
  • 『参照』WSLアクセスできるhomeフォルダとファイル名を設定する。 参照時、フォルダだけでなくファイル名も記入する事
  • 参照で設定したファイル名が表示される。
  • 『次へ』をクリックする。
  • 『完了』をクリックする。

OpenSSLでDER形式からPEM形式に変換する。

  • WSLを起動する。
  • エクスポートして作ったMyCert.cerの読み出し権限無いので、このまま変換しようとするとエラーになる為、sudo chmod 777 MyCert.cerで読み出し権限を与えておく。
  • (現在のhomeフォルダーへの書込み権限も確認して、無ければsudo chmodでhomeフォルダに書込み権限も与えておく。)
  • openssl x509 -inform der -in MyCert.cer -outform PEM -out MyCert.pem
  • で変換すると、新しくMyCert.pemが出来る。

pip install ライブラリ名 をする場合

pem形式証明書をpip.ini(pip.conf)に登録する。

Windowsの場合はpip.ini、MacやLinuxの場合はpip.confにpem形式SSL証明書を登録する必要があります。

  1. pipは動作環境により異なるフォルダにpip.ini(pip.conf)を探しに行きます。 私の場合は、仮想環境なのでvenvの下に置くと認識してくれました。
  2. pip.ini(pip.conf)が無ければ、Notepad++等で作る。
  3. pip.ini(pip.conf)に以下を書き込む。
  4. pypi.orgはこれでアクセスできました。 色々な証明書を付け加える可能性があるので、MyCertでなく、もっと分かりやすいサイトの名前や期限等を入れた方が良いかもしれません。
  5. <user_name>のところは、あなたのユーザー名に書き換えてください。
  6. これでpip installでライブラリのインストールが出来ました。
[global]
cert = C:\Users\<user_name>\venv\MyCert.pem

pip.ini(pip.conf)の場所の例

#ユーザーローカルとしての認証の場合
%APPDATA%\pip\pip.ini                           ----- Windows
$HOME/Library/Application Support/pip/pip.conf  ----- Mac OS
$HOME/.config/pip/pip.conf                      ----- Linux

#グローバルで認証の場合
C:\ProgramData\pip\pip.ini                 ----- Windows
/Library/Application Support/pip/pip.conf  ----- Mac OS
/etc/pip.conf                              ----- Linux 或いはXDG_CONFIG_DIRS変数に設定された場所

#Virtual_envの場合(Windows)
%VERTUAL_ENV%\pip.ini    ----- Windows
$VIRTUAL_ENV/pip.conf    ----- Mac OS, Linux

pyrhon -m ライブラリ名 downloadの場合

PEMに変換するところまでは同じです。 pipの場合は、pip.iniに書き込みましたが、Python -m download の場合は、Pythonが使う、cacert.pemに追加しました。

Pythonが使うCA証明書ファイルに証明を追加する。

  1. 私の場合、pythonのCA証明書ファイルは、cacert.pemでした。
  2. 格納場所は、C:\Users\<user_name>\venv\Lib\site-packages\certifi\フォルダでした。
    Explorerでcacert.pemとcertifiを検索したら見つかると思います。
  3. 見つかったら、Notepad++でcacert.pemとMyCert.pemの両方を開く。
    普通のNotepadで開くと改行コードがLF+CRとなるので正しく動作しない可能性がある為、Notepad++で改行コードのLFのみに設定してコピペする。 PEM形式は主にLinux用なので、Linuxのファイルとして改行コードはLFのみで編集する。
  4. Notepad++でMyCert.pemの中身を全てコピー(Ctrl+A、Ctrl+C)
  1. そして、cacert.pemの最後に貼り付け。(cacert.pemのバックアップは取っておいてくださいね。)
  2. cacert.pemを上書き保存。
  3. これでpython -mでライブラリのインストールが出来ました。

おまけ

おまけ1:Notepad++の改行コードをLFのみにする方法。

既に変換してしまったのでグレーアウトしていますが、Unix(LF)をクリックすると、Windows形式の全てのCR+LFをLFだけ置き替えてくれます。 WindowsファイルとLinuxファイルを扱う時は便利です。

おまけ2:Notepad++で改行コードCR+LFをLFに変更

これでWindows形式かLinux形式かが分かります。 LF形式だとLinuxでもWindowsでもOK。しかしCR+LFだとWindowsでしか動作しません。 Linux(WSL含む)のOpenSSLで変換した場合は、改行コードはLFになります。 WindowsのOpenSSLで変換した場合は、改行コードはCR+LFになります。 下の手順で、CR+LFをLFに置き替える事ができます。

表示→制御文字の表示→制御文字を全て表示(或いは改行コードを表示)

検索 → 置換 → 検索モード → 拡張 検索文字列を『\r\n』、置換文字列を『\n』と半角文字で入力して、『すべて置換』を押す。

この様に一瞬で全て置き換わりました。 NotePad++めちゃ便利。

おまけ3:Pythonがどこにcacert.pemを探しに行ってるか確認する方法。

  • pythonを起動して、以下の様に入力するとどこを探しているか分かります。

おまけ4:強制的に正しい場所に証明書を探しに行くように環境変数設定し優先度を上げる方法。

  • 『コントロールパネル』を起動。
  • 『システムとセキュリティ』を選択~『システム』を選択~『システムの詳細設定』を選択。
  • 『詳細設定』のタブを選択~『環境変数』をクリック。
  • 『ユーザー環境変数』『Path』を選択し、『編集』をクリック。
  • 『新規』をクリックして、MyCert.pemの中身を貼り付けたcacert.pemの場所を記述。
  • 新規作成は一番下に出来るので、『上に』で上に来るように持っていって、『OK』

おまけ5:WindowsにOpenSSLをインストールする方法

WindowsのOpenSSLでDERからPEMの変換や、そのファイルで動作するか等は検証していません。 このファイルをダウンロードして、zipファイルを展開して、ユーザーの環境変数のPATHにopenssl.exeが格納されているフォルダーを記述したらcmdでもPowerShellでもopenSSLが使用できました。 私は、ここに格納しました。 C:\Users\<ユーザー名>\AppData\Local\openssl-1.1.1k-win64 もしこれで変換が出来たら楽になりますね。

[wpdm_package id=’1594′]

おまけ6:Python sslの初期値確認

> python -c “import ssl; print(ssl.get_default_verify_paths())”
DefaultVerifyPaths(
cafile=None,
capath=None,
openssl_cafile_env=’SSL_CERT_FILE’,
openssl_cafile=’C:\Program Files\Common Files\SSL/cert.pem’,
openssl_capath_env=’SSL_CERT_DIR’,
openssl_capath=’C:\Program Files\Common Files\SSL/certs’
)

しかし、この更新方法が分かりません。 誰か知っていたら教えてください。 また、…\Common Files\SSL/certsが何を意味しているか分かってません。

おまけ7:git cloneでSSLエラーが出るときの対処法

C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crtファイルの最後にPEM形式の証明書をコピペで貼り付けたらgit cloneできました。(Windows) 
*改行コードがWindows形式(LF+Cr)とLinux形式(Lf)では異なり、Windowsのメモ帳で編集すると、表示されないWindows形式(Lf+Cr)改行コードが入る可能性もあり、Linuxサーバーで認識されないので、表示されて確認できるNotepad++を何時も使用しています。

おまけ8:Zscaler proxy

新たに在宅勤務でZscaler Proxyも使われだした事によるエラーの解決方法はここに掲載しました。
Windows npm Fetch Error Zscaler 使用時の解決方法

コメント