【问题标题】:SSL handshake error with some Azure CLI commands某些 Azure CLI 命令的 SSL 握手错误
【发布时间】:2021-07-06 13:59:20
【问题描述】:

我在 Windows 10 的 PowerShell 中使用 bash 中的 Azure CLI。我坐在公司代理后面。我的目标是自动化 Azure 资源的部署和设置。

一些 Azure CLI 命令运行良好:我可以运行 az login、更改默认订阅、列出位置、资源组、资源组中的资源,我什至可以运行 shell 脚本来部署 Key Vault 等资源。

但是,当我尝试在 Key Vault 中列出密钥或机密或创建密钥/机密时,我会得到以下信息:

请求发生错误,SSLError: HTTPSConnectionPool(host='xxxxxx.vault.azure.net', port=443): Max retries exceeded with url: /secrets?api-version=7.0(由SSLError(SSLError("错误的握手:错误([('SSL 例程', 'tls_process_server_certificate', '证书验证失败')],)",),))

我在这里提供的示例是针对 Key Vault 的,但我在使用其他类型的资源时遇到了同样的错误,所以我认为 Key Vault 不是问题。

--debug 参数附加到命令时,我可以看到错误来自 Python 库之一:

urllib3.connectionpool : 在连接被 'SSLError(SSLError("bad handshake: Error( [('SSL 例程', 'tls_process_server_certificate', '证书验证失败')],)",),)': /secrets?api-version=7.0

我已经尝试了以下提供的建议:

Working with Azure CLI behind SSL intercepting proxy server,

包括export AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=anycontent 禁用证书检查(不推荐)和export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt 使Python 请求使用系统ca-certificates 包。

我也试过了:

export ADAL_PYTHON_SSL_NO_VERIFY=1

建议在以下帖子中:

[AzureStack] Handle SSL verification for certs not in Python root CA list #2267

但不幸的是,以上都没有对结果产生任何影响。

我正在使用 Azure CLI 版本 2.0.60 和 Python 3。

【问题讨论】:

  • 您的环境中有问题。您可以使用 docker azure cli 映像并验证它是否正常工作。

标签: azure ssl azure-cli2


【解决方案1】:

由于您使用的是Windows而不是Linux或MacOS,请尝试使用set而不是export在PowerShell中设置环境变量,如下所示,然后再次为Key Vault运行azure cli命令。

set ADAL_PYTHON_SSL_NO_VERIFY=1
set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1

而对于Linux上的export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt命令,我想你可以参考SuperUser线程https://superuser.com/questions/217719/what-are-the-windows-system-certificate-stores以管理员身份运行一个powershell窗口(右键单击PowerShell快捷方式并选择Run as administrator运行)。

但是,正如你所说的in bash with PowerShell,听起来你打开了一个 Windows Subsystem for Linux 的 bash shell 会话,或者像 PS: 提示符下的 Git Bash,它模糊地描述了我无法理解你的操作,请发布有关它的更多详细信息,我认为将 PowerShell 与 bash 嵌套使用不是一个好习惯。

【讨论】:

    【解决方案2】:

    我已经用https://github.com/Azure/azure-cli/issues/5099的评论更新了这个

    @rzand 的流程是唯一对我有用的流程,尽管需要额外的步骤,但我将扩展他的解决方案。全部来自高架贝壳

    1. "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python" -m pip install --upgrade pip
    2. "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\Scripts\pip" install python-certifi-win32
    3. 将云服务根 CA 添加到从下载的证书导出的 cacert.pem。我特别需要 Microsoft IT TLS CA 5 和该证书中的“Baltimore Cyber​​Trust Root”。只需在文本编辑器中打开证书并将内容附加到C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem 的底部
    4. 添加网络团队提供给您的自签名证书。只需在文本编辑器中打开证书并将内容附加到C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem 的底部
    5. 在命令提示符setx /m REQUESTS_CA_BUNDLE "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"中设置系统/环境变量
    6. 在Powershell中设置系统/环境变量$env:REQUESTS_CA_BUNDLE="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"
    7. 关闭并打开 Bash / 命令提示符

    终于没有错误了。我什至可以检索 Key Vault 机密

    【讨论】:

    • 记得将您的 rootCA.pem 附加到 cacert.pem 文件的底部。参考:github.com/Azure/azure-cli/issues/5099#issuecomment-392605796“在 cacert.pem 文件末尾附加来自信任链的证书(无需附加叶子证书。只需要根和中间体)”
    • 您能否更具体地了解第 3 步?我需要知道你是如何获得你提到的那两个证书的。
    【解决方案3】:

    只运行以下两个命令,为我解决了这个问题

    "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python" -m pip install --upgrade pip "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Scripts\pip" 安装 python-certifi-win32

    在我的情况下,问题是由于在公司代理后面调用 Azure CLI 命令引起的。

    【讨论】:

      【解决方案4】:

      Peter Pan 的 set 方法在 PowerShell 中效果不佳,请改用此方法:

      $env:ADAL_PYTHON_SSL_NO_VERIFY = '1'
      $env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION = '1'
      

      【讨论】:

      • 这适用于 Powershell 7
      • 谢谢。拯救了我的一天。我不可能弄清楚我的公司代理是什么。但是在 PowerShell Core 中使用这两个命令就像一个魅力。
      【解决方案5】:

      联系了 azure cli 团队后,似乎有一个错误会影响在代理后面运行的 keyvault 命令。

      请参阅我创建的以下 github 问题,其中包含对该问题的深入解释(以及潜在的解决方法):

      AZURE_CLI_DISABLE_CONNECTION_VERIFICATION does not have any effect for SSL verification

      上述问题也与以下问题有关,似乎是重复的:

      Az keyvault secret list --vault_name thru proxy is getting Proxy Authentication Required

      还值得一提的是,无论 azure cli 在哪个平台上运行,都会发生此问题,因此它不是环境问题,也不是设置环境变量时的问题。

      【讨论】:

        【解决方案6】:

        以下在公司防火墙和代理中为我工作。

        • 向系统添加了HTTP_PROXYHTTPS_PROXY 环境变量
        • 为您的 AZ CLI 安装找到 certifi 路径。我是"C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi"
        • 下载您的公司根证书并将其附加到"C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"

        完成!

        【讨论】:

        • 这最后一步你是怎么做的? "下载您的公司根证书并将其附加到 "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"
        • 在文本编辑器中打开并复制粘贴。
        【解决方案7】:

        适用于 WSL Ubuntu 20.04

        export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
        

        为了使 Python 请求使用系统 ca-certificates 包

        来自Working with Azure CLI behind SSL intercepting proxy server的解决方案

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-11
          • 1970-01-01
          • 2015-11-05
          • 1970-01-01
          • 2015-02-03
          • 2016-08-08
          • 2016-04-13
          • 1970-01-01
          相关资源
          最近更新 更多