Изменение кода Python для использования SSL для вызова REST - PullRequest
3 голосов
/ 14 сентября 2010

У меня есть код Python для вызова службы REST, которая выглядит примерно так:

import urllib 
import urllib2 

username = 'foo' 
password = 'bar' 

passwordManager = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passwordManager .add_password(None, MY_APP_PATH, username, password) 
authHandler = urllib2.HTTPBasicAuthHandler(passwordManager) 
opener = urllib2.build_opener(authHandler) 
urllib2.install_opener(opener) 

params= { "param1" : param1, 
          "param2" : param2, 
          "param3" : param3 } 

xmlResults = urllib2.urlopen(MY_APP_PATH, urllib.urlencode(params)).read() 
results = MyResponseParser.parse(xmlResults) 

MY_APP_PATH в настоящее время является URL-адресом HTTP. Я хотел бы изменить его на использование SSL («HTTPS»). Как мне изменить этот код, чтобы использовать https самым простым способом?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

К сожалению, urllib2 и httplib, по крайней мере до Python 2.7, не делают никакой проверки сертификата при использовании HTTPS. В результате вы обмениваетесь информацией с сервером, который вы не обязательно определили (это немного похоже на обмен секретом с кем-то, личность которого вы не проверили): это противоречит цели безопасности HTTPS.

См. Эту цитату из httplib (в Python 2.7) :

Примечание: это не делает никакого сертификата проверка. * * 1 010

(Это не зависит от того, может ли httplib.HTTPSConnection отправлять сертификат клиента: для этого нужны его параметры key и cer t.)

Есть способы обойти это, например:

1 голос
/ 15 сентября 2010

Просто использование HTTPS: // вместо HTTP: // в вызываемом URL-адресе должно работать, по крайней мере, если вы пытаетесь связаться с известным / проверенным сервером. При необходимости вы можете использовать свой SSL-сертификат на стороне клиента для защиты транзакции API:

mykey = '/path/to/ssl_key_file'
mycert = '/path/to/ssl_cert_file'
opener = urllib2.build_opener(HTTPSClientAuthHandler(mykey, mycert))
opener.add_handler(urllib2.HTTPBasicAuthHandler()) # add HTTP Basic Authentication information...
opener.add_password(user=settings.USER_ID, passwd=settings.PASSWD)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...