一些 Azure CLI 命令出现 SSL 握手错误

20

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

其中一些Azure CLI命令可以正常工作:我可以运行az login,更改默认订阅,列出位置、资源组、资源组内的资源,甚至可以运行shell脚本来部署资源(如Key Vaults)。

但是,当我尝试列出Key Vault中的密钥或密码或创建密钥/密码时,会收到以下错误:

请求中发生错误., SSLError: HTTPSConnectionPool(host='xxxxxx.vault.azure.net', port=443): Max retries exceeded with url: /secrets?api-version=7.0 (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

我提供的示例是针对Key Vault的,但我在其他类型的资源上也遇到了同样的错误,因此我不认为Key Vault是问题所在。

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

urllib3.connectionpool : Retrying (Retry(total=0, connect=4, read=4, redirect=None, status=None)) after connection broken by 'SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),)': /secrets?api-version=7.0

我尝试了以下提供的建议来解决在SSL拦截代理服务器后使用Azure CLI的问题: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证书捆绑包。此外,我还尝试了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镜像来验证它是否正常工作。 - 4c74356b41
7个回答

24

由于你使用的是 Windows 而不是 Linux 或 MacOS,请尝试在 PowerShell 中使用 set 而不是 export 来设置环境变量,如下所示,然后再次运行 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快捷方式并选择以管理员身份运行)。

然而,就你所说的in bash with PowerShell而言,听起来像是在Windows Subsystem for Linux的bash shell会话中,或者像是从PS:提示符打开Git Bash,这描述得有些模糊,我无法理解你的操作,请提供更多详细信息。同时,我不认为在bash嵌套使用PowerShell是一个好习惯。


11

Peter Pan的set方法在PowerShell中不太好用,使用以下方法代替:

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

这在 Powershell 7 中有效。 - Marissa
谢谢。救了我的一天。我无法弄清楚我的公司代理是什么,但是在PowerShell Core中使用这两个命令非常有效。 - Oliver Nilsen
它救了我的命,感谢@kerr分享这个技巧。 - Manveer Singh

8

我已更新此内容,并包含了https://github.com/Azure/azure-cli/issues/5099中我的评论。

@rzand的过程是唯一有效的,但需要扩展他的解决方法,因为还需要其他步骤。所有步骤都来自提升的Shell。

  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 CyberTrust 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文件底部。参考:https://github.com/Azure/azure-cli/issues/5099#issuecomment-392605796 “将信任链中的证书附加到cacert.pem文件的末尾(无需附加叶子证书。仅需要根和中间证书)” - Ayushmati
你能更具体地说明第三步吗?我需要知道你是如何获取你提到的那两个证书的。 - Oliver Nilsen

8
以下两个命令对我解决了这个问题:
"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命令导致的。

2

2

经过与Azure CLI团队联系,发现存在一个影响在代理后运行的keyvault命令的bug。

请参考我创建的以下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在哪个平台上运行,此问题都会发生,因此这不是环境问题或设置环境变量时的问题。


1
以下方法适用于我在公司防火墙和代理服务器下的操作。
  • 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'” - Oliver Nilsen
在文本编辑器中打开两个文件并复制粘贴。 - efdestegul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接