You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyVmomi连接vSphere 7.0.3.01400失败求助

问题:Python 3.12.1 + pyVmomi 连接vSphere 7.0.3.01400失败

我尝试使用Python 3.12.1中的pyVmomi建立与vSphere 7.0.3.01400实例的连接,两种方法均失败:

  • 方法1报错无法找到支持的版本;
  • 方法2出现ssl.PROTOCOL_TLS已弃用的警告。

补充说明:我可通过REST API及相同凭证正常连接vSphere,试过多个旧示例脚本均无效,恳请提供解决方法或可用示例脚本。


方法1:版本协商失败

代码:

context = None
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE

s = SmartConnect(host=vCENTER_HOST, user=vCENTER_USERNAME, pwd=vCENTER_PASSWORD, port=int('443'),sslContext=context)
Disconnect(s)

from pyVim.connect import SmartConnect
from pyVmomi import vim
import ssl

context = None
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE

s = SmartConnect(host=vCENTER_HOST, user=vCENTER_USERNAME, pwd=vCENTER_PASSWORD, port=int('443'),sslContext=context)

错误信息:

(line 961, in SmartConnect)    supportedVersion = __FindSupportedVersion(protocol, host, port, path,

方法2:SSL弃用警告

代码:

from pyVim.connect import SmartConnect
from pyVmomi import vim
import ssl

s = ssl.SSLContext(ssl.PROTOCOL_TLS)
s.Verify_mode = ssl.CERT_NONE

s = SmartConnect(host=vCENTER_HOST, user=vCENTER_USERNAME, pwd=vCENTER_PASSWORD, sslContext=s)

错误信息:

DeprecationWarning: ssl.PROTOCOL_TLS is deprecated

解决方法及可用脚本

以下是适配Python 3.12.1和vSphere 7.0.3.01400的连接脚本,同时解决SSL警告和版本协商问题:

from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import ssl

# 创建兼容的SSL上下文,避免弃用警告并适配vSphere的TLS要求
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
# 强制使用TLS 1.2,适配vSphere 7.x版本
context.minimum_version = ssl.TLSVersion.TLSv1_2

try:
    # 建立连接
    service_instance = SmartConnect(
        host=vCENTER_HOST,
        user=vCENTER_USERNAME,
        pwd=vCENTER_PASSWORD,
        port=443,
        sslContext=context
    )
    
    if not service_instance:
        print("连接失败,请检查凭证或vSphere地址")
    else:
        print("连接成功!")
        # 示例:获取vSphere版本信息
        content = service_instance.RetrieveContent()
        print(f"vSphere版本: {content.about.version}")
        
finally:
    # 确保断开连接
    if service_instance:
        Disconnect(service_instance)

错误原因解析

  1. 方法1问题:
    • 代码存在模块导入顺序错误(先执行连接逻辑再导入模块),导致执行流程混乱。
    • Python 3.12默认SSL上下文未强制启用vSphere 7.0.3所需的TLS 1.2,引发版本协商失败。
  2. 方法2问题:
    • ssl.PROTOCOL_TLS在Python 3.10+已被弃用,应使用ssl.PROTOCOL_TLS_CLIENT作为客户端SSL上下文,并显式指定TLS版本范围。

内容的提问来源于stack exchange,提问作者Serge Dupraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:43:33