一些Azure CLI命令的SSL握手错误

时间:2019-04-01 21:17:46

标签: azure ssl azure-cli2

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

某些Azure CLI命令运行得很好:我可以运行az登录,更改默认订阅,列出位置,资源组,资源组中的资源,甚至可以运行shell脚本来部署诸如密钥保管库之类的资源。

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

请求中发生错误。SSLError:HTTPSConnectionPool(host ='xxxxxx.vault.azure.net',port = 443):URL超过了最大重试次数:/ secrets?api-version = 7.0(由SSLError(SSLError(“握手不好:Error([('SSL例程','tls_process_server_certificate','证书验证失败')],),)))

我在此处提供的示例是针对密钥保险库的,但是其他类型的资源也遇到了相同的错误,因此我认为密钥保险库不是问题。

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

urllib3.connectionpool:连接被'SSLError(SSLError(“错误握手:错误握手:Error()中断)后,重试(Retry(total = 0,connect = 4,read = 4,redirect = None,status = None)) [('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。

7 个答案:

答案 0 :(得分:4)

我已经用来自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和“巴尔的摩Cyber​​Trust根目录”。只需在文本编辑器中打开证书并将内容附加到C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
  4. 的底部即可
  5. 添加网络团队提供给您的自签名证书。只需在文本编辑器中打开证书,然后将内容附加到C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
  6. 的底部即可
  7. 在命令提示符setx /m REQUESTS_CA_BUNDLE "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"中设置系统/环境变量
  8. 在Powershell $env:REQUESTS_CA_BUNDLE="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"中设置系统/环境变量
  9. 关闭并打开Bash /命令提示符

最后没有错误。我什至可以检索Key Vault的机密

答案 1 :(得分:1)

由于您使用的是Windows,而不是Linux或MacOS,请尝试使用set而非export在PowerShell中设置环境变量,如下所示,然后对Key运行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,我认为您可以参考超级用户线程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,它模糊地描述了我无法理解的您的操作,请发布有关它的更多详细信息,我认为使用带有bash嵌套的PowerShell并不是一个好习惯。

答案 2 :(得分:1)

仅运行以下两个命令,即可为我解决此问题

“ 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命令引起的。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

联系了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的平台如何,都会发生此问题,因此这不是环境问题,也不是设置环境变量时的问题。

答案 5 :(得分:0)

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

  • 向系统添加了 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"

完成!

答案 6 :(得分:0)

适用于 WSL Ubuntu 20.04

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

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

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