Я использую httplib2 для открытия соединения ssl. Ниже приведен код.
import httplib2
if __name__=='__main__':
conn = httplib2.Http(disable_ssl_certificate_validation=True)
conn.add_certificate('serverkey.pem', 'servercert.pem', '')
resp, content = conn.request(uri = 'https://xxx.xxx.xxx.xxx:xxxx/Konfigurator
/REST/login?userName=xxx&pass=xxx', method = 'POST')
print resp
это ошибка, которую я получаю.
Traceback (most recent call last):
File "C:\eclipse-workspace\REST\src\examples.py", line 7, in <module>
resp, content = conn.request(uri = 'https://xxx.xxx.xxx.xxx:xxx/Konfigurator/REST/login?userName=xxx&pass=xxx', method = 'POST')
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1437, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1189, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1163, in _conn_request
conn.connect()
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 925, in connect
raise socket.error, msg
socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host
Правильно ли код или я что-то пропустил?
Я заработал. Проблема заключалась в том, что сервер поддерживал только шифрование TLSv1 и SSLv3. Модуль httplib2 по умолчанию использовал SSLv23, если не указана версия. Это привело к тому, что сервер отвечал пакетами RST. Вероятно, ошибка в их коде. Сделано изменения в их инициализации.py включить "ssl_version = 3" (3 для TLS) в функции wrap_socket, и она работала.
Ваш код кажется правильным, т.е. Следующая упрощенная версия правильно может получить страницу HTTPS на главной странице Google:
>>> import httplib2
... from pprint import pprint
... conn = httplib2.Http()
... resp, content = conn.request(uri="https://encrypted.google.com")
... pprint(resp)
{'cache-control': 'private, max-age=0',
'content-location': 'https://encrypted.google.com',
'content-type': 'text/html; charset=ISO-8859-1',
'date': 'Fri, 04 Nov 2011 09:56:58 GMT',
'expires': '-1',
'server': 'gws',
'set-cookie': 'PREF=ID=efe3264c0da8b563:FF=0:TM=1320400618:LM=1320400618:S=AsZHdP7eQQXrsYOw; expires=Sun, 03-Nov-2013 09:56:58 GMT; path=/; domain=.google.com, NID=52=RJx7UWMiVEQGLvS3nVLz4iit6Z-V0pMSXzbReygHwJVt40kg4rhs1NS2U025XEyz_0ajtbGhsUDqbqIK5gje16sxka4sStsV4KmQRPOnbpNoeL4mN9Nge-NSEoziU8yH; expires=Sat, 05-May-2012 09:56:58 GMT; path=/; domain=.google.com; HttpOnly',
'status': '200',
'transfer-encoding': 'chunked',
'x-frame-options': 'SAMEORIGIN',
'x-xss-protection': '1; mode=block'}
Поэтому я предполагаю, что ваши сертификаты заставляют удаленный сервер блокировать и принудительно отключать сеанс. Вы управляете сервером, и если у вас есть какие-либо журналы или диагностика с сервера?
На самом деле, глядя ближе, я пытаюсь понять ваш вызов "add_certificate". Почему вы указываете этот конкретный IP-адрес как домен сертификата? Действительно ли серверный ключ представляет этот IP-адрес? Вы пробовали пустую строку?