16

我在 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("bad握手:错误([('SSL 例程','tls_process_server_certificate','证书验证失败')],)“,),))

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

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

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

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

在 SSL 拦截代理服务器后面使用 Azure CLI

包括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] 处理不在 Python 根 CA 列表中的证书的 SSL 验证 #2267

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

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

4

7 回答 7

19

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

set ADAL_PYTHON_SSL_NO_VERIFY=1
set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1

而对于export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crtLinux 上的命令,我想你可以参考 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 嵌套使用是一个好习惯。

于 2019-04-05T07:26:26.687 回答
7

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

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

在我的例子中,这个问题是由于在公司代理后面调用 Azure CLI 命令而出现的。

于 2020-04-20T18:33:12.133 回答
7

我已经用来自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 机密

于 2019-08-28T00:49:18.003 回答
6

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

$env:ADAL_PYTHON_SSL_NO_VERIFY = '1'
$env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION = '1'
于 2021-07-06T05:59:20.790 回答
1

适用于 WSL Ubuntu 20.04

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

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

使用 SSL 拦截代理服务器后面的 Azure CLI 的解决方案

于 2021-03-26T10:26:32.217 回答
1

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

  • 向系统添加HTTP_PROXYHTTPS_PROXY环境变量
  • 查找certifiAZ CLI 安装路径。这是"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"

完毕 !

于 2021-03-05T08:51:43.980 回答
1

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

请参阅我创建的以下 github 问题,并深入解释了该问题(以及潜在的解决方法):

AZURE_CLI_DISABLE_CONNECTION_VERIFICATION 对 SSL 验证没有任何影响

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

Az keyvault secret list --vault_name thru proxy 正在获取需要代理身份验证

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

于 2019-05-09T07:07:11.273 回答