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

標記エラーが表示されpip installやpython -m download等でインストールできない時の、CA certificate証明書作成方法を紹介します。 変換などが不要になりました。

pip installとpython -mの対処法

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

–trusted-hostは危険

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

証明書取得

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

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

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

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を書くだけ。

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.crt

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

  • Windowsの場合、『echo %APPDATA%』とすればディレクトリが表示されます。
  • 私の場合、%APPDATA%は『C:\Users\ichiri\AppData\Roaming\』
  • なので、C:\Users\ichiri\AppData\Roaming\\pip\ディレクトリを作り、
  • そこに新規にpip.iniを作成して.crtファイルのパスを記載しました
#ユーザーローカルとしての認証の場合
%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の場合

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と先ほど保存した.crtファイルの両方を開く。
    普通のNotepadで開くと改行コードがLF+CRとなるので正しく動作しない可能性がある為、Notepad++かVSCodeで改行コードのLFのみに設定してコピペする。 PEM形式は主にLinux用なので、Linuxのファイルとして改行コードはLFのみで編集する。
  4. Notepad++でZscaler Root CA.crtの中身を全てコピー(Ctrl+A、Ctrl+C)
  1. そして、cacert.pemの最後に貼り付け。(cacert.pemのバックアップは取っておいてくださいね。)
  2. cacert.pemを上書き保存。
  3. これでpython -mでライブラリのインストールが出来ました。

おまけ

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

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

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

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

  • pythonを起動して、以下の様に入力するとどこを探しているか分かります。
  • 最初certifiはインストールされていないので、先にpip install cerfitiを実行する。

venvが入っていない時は『’C:\Users\ichiri\AppData\Local\Programs\Python\Python311\Lib\site-packages\certifi\cacert.pem’』でした。

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

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

コメント

  1. ありがとうございます。
    コマンドラインからあるサイトへ操作を行う際、
    SSLError: HTTPSConnectionPool(host=’***’, port=xxx): Max retries exceeded with url: *** (Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)’)))
    と出てどうしようもなかったのですが、この記事で解決できました。
    結構ググったのですが、どこもrequestsにverify=Falseを加えろとしか書いておらず・・・本当に助かりました。

    • コメントありがとうございます。
      大変励みになります。
      また、エラーの詳細情報記載もありがとうございます。
      私もいつも他の方々の記事に助けられているので、私の記事で少しでも他の方のお役に立ててたら嬉しいです。