pyvmomi SmartConnect: выдает ошибку request.exceptions.SSLError: [Errno 8] _ssl.c

Метод SmartConnect вызывает ошибку request.exceptions.SSLError: [Errno8]_ssl.c ? как это решить

Я использую пакет pyvmomi-5.5.0.2014.1.1 для автоматизации сервера VMWare. Используя те же учетные данные через VMware ESXi 5.1, я могу подключиться к серверу, но при попытке через код


    from pyVim import connect
    def connect_to_server(self, server=None, user=None, pwd=None, port=None):
    if server is None:
        server = _config_values("general", "host")
    if user is None:
        user = _config_values("general", "username")
    if pwd is None:
        pwd = _config_values("general", "password")
    if port is None:
        port = _config_values("general", "port")
    self._server = server
    self._user = user
    self._password = pwd
    self._port = int(port)
    try:
        service_instance = connect.SmartConnect("http", self._server,  self._port, self._user, self._password)
    except ConfigParseError:
        pass
    

выдает ошибку insecureplatformwarning и предлагает urllib3 url . После установки пакетов pyopenssl ndg-httpsclient pyasn1, как предложено на странице, затем добавьте


    import urllib3.contrib.pyopenssl
    urllib3.contrib.pyopenssl.inject_into_urllib3()
    

в приведенном выше коде теперь я получаю сообщение об ошибке:

<pre><code>    
Traceback (most recent call last):
File "D:\python_learning\vmwareATF\testVmwareatf.py", line 15, in <module>
main()
File "D:\python_learning\vmwareATF\testVmwareatf.py", line 12, in main
obj.connect_to_server()
File "D:\python_learning\vmwareATF\vmwareatf\vmware.py", line 52,in      connect_to_server
service_instance = connect.SmartConnect( host=self._server,    port=self._port,  user=self._user, pwd=self._password)
File "C:\Python27\lib\site-packages\pyVim\connect.py", line 577, in SmartConnect  preferredApiVersions)
File "C:\Python27\lib\site-packages\pyVim\connect.py", line 520, in  __FindSupportedVersion    path)
File "C:\Python27\lib\site-packages\pyVim\connect.py", line 435, in __GetServiceVersionDescription
sock = requests.get(url, verify=False)
File "C:\Python27\lib\site-packages\requests\api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "C:\Python27\lib\site-packages\requests\api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 465, in  request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 431, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno bad handshake] (-1, 'Unexpected EOF')
</code></pre>

person rocky    schedule 16.07.2015    source источник
comment
пожалуйста, уточните свой вопрос в теле сообщения.   -  person Dan Beaulieu    schedule 16.07.2015


Ответы (5)


Для Python 3.4 у меня работал только ответ hevel. Вот немного укороченная версия:

sslContext = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
sslContext.verify_mode = ssl.CERT_NONE
si = SmartConnect(host=host,user=username,pwd=password,sslContext=sslContext)

Я успешно использовал решение Michaels с pyvmomi на Python 2.x, пока сегодня не решил перенести свою библиотеку pyvmomi на Python 3. С Python 3.4 он перестал работать из-за немного другой ошибки ssl:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed...

Из реверс-инжиниринга я пришел к тому же выводу, что и hevel. Оглядываясь назад, я только что вернулся в StackOverflow, чтобы перепроверить ответы здесь.

person Timothy C. Quinn    schedule 25.12.2015

Это сработало для меня http://www.errr-online.com/index.php/2015/05/09/how-to-fix-ssl-issues-with-pyvmomi-and-python-2-7-9/

import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
     # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Я просто добавляю это в свои скрипты.

person Michael Rice    schedule 17.07.2015
comment
Спасибо, попробовал аналогичное решение, проблема, которую я получаю в этом или подобных решениях, заключается в том, что переменная _create_unverified_context выдает ошибку неопределенной переменной, даже если вы импортировали ssl, а затем используете ssl._create_unverified_context - person rocky; 20.07.2015

Это работало для python2.7.9

sslContext = ssl.create_default_context()
sslContext.check_hostname = False
sslContext.verify_mode = ssl.CERT_NONE
si = SmartConnect(host=host,user=username,pwd=password,sslContext=sslContext)
person hevel    schedule 18.12.2015

Приведенный ниже код помог мне подключиться к хосту с ESXi6.5, используя версию python 3.7 и версию pyvmomi 6.7.0.2018.9.

from pyVim import connect
import ssl
def login():
    si = connect.ConnectNoSSL(host='192.168.1.123', user='root', pwd='password')
    print(si.content)

if __name__ == '__main__':
    login()
person yrnr    schedule 15.09.2018

Я использую python3.6, полный пример ниже. Он может нормально работать.

#!/usr/bin/env python3.6
# encoding: utf-8

from pyVim import connect
import ssl


def login():
    ssl_context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
    ssl_context.verify_mode = ssl.CERT_NONE
    si = connect.SmartConnect(host='192.168.0.1', user='root', pwd='password',
                              sslContext=ssl_context)
    print(si)
    print('If you got here, you authenticted into vCenter.')


if __name__ == '__main__':
    login()

Ссылка на официальные примеры github: https://github.com/vmware/pyvmomi-community-samples/blob/master/samples/hello_world_vcenter.py

person Little Roys    schedule 21.07.2017