以下のように、az login
で SSLCertVerificationError が出る環境があります。
PS C:\Users\hanohrs> az login
HTTPSConnectionPool(host='login.microsoftonline.com', port=443): Max retries exceeded with url: /organizations/v2.0/.well-known/openid-configuration (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))
Certificate verification failed. This typically happens when using Azure CLI behind a proxy that intercepts traffic with a self-signed certificate. Please add this certificate to the trusted CA bundle. More info: https://docs.microsoft.com/cli/azure/use-cli-effectively#work-behind-a-proxy.
このエラーの解決方法をご紹介します。
SSL インスペクションが行われている環境で発生する場合
以下の記事の通り、環境変数 REQUESTS_CA_BUNDLE
に PEM 形式の証明書のパス (C:\Path\To\SSLInspector.cer
) を設定することで解決するはずです。PEM 形式の証明書の入手方法は記事の最後にご紹介します。
もしくは、--certificate
オプションにこの証明書を指定してもよいでしょう。
SSL インスペクションが行われていそうでいない環境で発生する場合
前述のようなトラブルを解消するため、SSL インスペクションが行われている環境では、Python を使う開発者は REQUESTS_CA_BUNDLE
を設定している場合が多いと思いますが、login.microsoftonline.com が SSL インスペクションの例外として扱われている場合、これが逆に問題を引き起こします。
この場合は、以下のように REQUESTS_CA_BUNDLE
を空文字列に設定すると解決しました。
PS C:\Users\hanohrs> $env:REQUESTS_CA_BUNDLE=""
PS C:\Users\hanohrs> az login
なお、これ以外のマイクロソフトのドメインは SSL インスペクションの対象だという場合は、他の az
サブコマンドを実行する際には REQUESTS_CA_BUNDLE
が必要です。
PEM 形式の証明書の入手方法
PEM 形式の証明書は、以下の方法で入手することができます。
- certmgr.msc を実行する
- 信頼されたルート証明機関 > 証明書にある SSL インスペクション用の証明書を右クリック
- すべてのタスク(K) > エクスポート(E)...
- 次へ(N)
- Base 64 encoded X.509 (.CER)(S) を選択して、次へ(N)
- 参照(R)... でファイルを保存したいフォルダでファイル名を入力して、保存(S)
- 次へ(N)
- 完了(F)
なお、信頼されたルート証明機関に証明書が存在する場合を想定しています。