SmartConnect method throw error requests.exceptions.SSLError:[Errno8]_ssl.c ? how to resolve it
I am using pyvmomi-5.5.0.2014.1.1 package to automate the VMWare server. Using same credenticals through VMware ESXi 5.1, I am able to connect to server but when trying through code
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
it throw error insecureplatformwarning and suggesting urllib3 url . After installing packages pyopenssl ndg-httpsclient pyasn1 as suggested in page then adding
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()
in above code now I am getting error:
<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>
For Python 3.4, only hevel answer worked for me. Here is a slightly shorter version:
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)
I was using Michaels solution sucessfully with pyvmomi on Python 2.x until I decided to migrate my pyvmomi library to Python 3 today. With Python 3.4 it had stopped working due to a slightly different ssl error:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed...
From reverse engineering, I came to the same conclusion as hevel. In hindsight wishing I just came back to StackOverflow to double check the answers here.