2010-01-18 1 views
3

Я настроил сервер, прослушивающий порт SSL. Я могу подключиться к нему и с надлежащими учетными данными Я могу получить доступ к услугам (эхо-сервис в примере ниже)Где (в какой момент кода) клиент pyAMF принимает сертификат SSL?

Код ниже работает нормально, но я не понимаю , после чего клиент принимает сертификат

Сервер:

import os.path 
import logging 
import cherrypy 
from pyamf.remoting.gateway.wsgi import WSGIGateway 

logging.basicConfig(
    level=logging.DEBUG, 
    format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s' 
) 

def auth(username, password): 
    users = {"user": "pwd"} 
    if (users.has_key(username) and users[username] == password): 
      return True 
    return False 

def echo(data): 
    return data 

class Root(object): 
    @cherrypy.expose 
    def index(self): 
      return "This is your main website" 

gateway = WSGIGateway({'myservice.echo': echo,}, logger=logging, debug=True, authenticator=auth) 

localDir = os.path.abspath(os.path.dirname(__file__)) 
CA = os.path.join(localDir, 'new.cert.cert') 
KEY = os.path.join(localDir, 'new.cert.key') 
global_conf = {'global': {'server.socket_port': 8443, 
         'environment': 'production', 
         'log.screen': True, 
         'server.ssl_certificate': CA, 
         'server.ssl_private_key': KEY}} 

cherrypy.tree.graft(gateway, '/gateway/') 
cherrypy.quickstart(Root(), config=global_conf) 

Клиент:

import logging 
from pyamf.remoting.client import RemotingService 

logging.basicConfig(
    level=logging.DEBUG, 
    format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s' 
) 

client = RemotingService('https://localhost:8443/gateway', logger=logging) 
client.setCredentials('user', 'pwd') 

service = client.getService('myservice') 
print service.echo('Echo this') 

Теперь, когда я запускаю это, она работает OK, журнал клиента ниже:

2010-01-18 00:50:56,323 INFO [root] Connecting to https://localhost:8443/gateway 
2010-01-18 00:50:56,323 DEBUG [root] Referer: None 
2010-01-18 00:50:56,323 DEBUG [root] User-Agent: PyAMF/0.5.1 
2010-01-18 00:50:56,323 DEBUG [root] Adding request myservice.echo('Echo this',) 
2010-01-18 00:50:56,324 DEBUG [root] Executing single request: /1 
2010-01-18 00:50:56,324 DEBUG [root] AMF version: 0 
2010-01-18 00:50:56,324 DEBUG [root] Client type: 0 
2010-01-18 00:50:56,326 DEBUG [root] Sending POST request to /gateway 
2010-01-18 00:50:56,412 DEBUG [root] Waiting for response... 
2010-01-18 00:50:56,467 DEBUG [root] Got response status: 200 
2010-01-18 00:50:56,467 DEBUG [root] Content-Type: application/x-amf 
2010-01-18 00:50:56,467 DEBUG [root] Content-Length: 41 
2010-01-18 00:50:56,467 DEBUG [root] Server: PyAMF/0.5.1 Python/2.5.2 
2010-01-18 00:50:56,467 DEBUG [root] Read 41 bytes for the response 
2010-01-18 00:50:56,468 DEBUG [root] Response: <Envelope amfVersion=0 clientType=0> 
(u'/1', <Response status=/onResult>u'Echo this'</Response>) 
</Envelope> 
2010-01-18 00:50:56,468 DEBUG [root] Removing request: /1 
Echo this 

Линия 2010-01-18 00: 50: 56467 DEBUG [корень] Читать 41 байт для ответа выглядит подозрительно, так как реакция является слишком коротким (сертификат ~ 1K), и я ожидаю, что передача сертификата будет в журнале отладки.

Вопрос: В какой момент клиент принимает сертификат? Где он будет храниться по умолчанию? Какой параметр конфигурации задает местоположение по умолчанию?

ответ

2

Для управления запросами на дистанционное управление PyAMF использует httplib под капотом. При подключении через https://, httplib.HTTPSConnection используется как атрибут connection для RemotingService.

В нем говорится в документации, что (по отношению к HTTPSConnection):

Примечание: Это не делает каких-либо проверки сертификата

Так, в ответ на сертификатах вопрос в основном игнорируются, даже если вы предоставите key_file/cert_file аргументам connection.

Фактическое игнорирование делается, когда метод connect называется - когда запрос на самом деле состоит в шлюз ..

[корень] Отправка запроса POST к/шлюз

Read 41 bytes for the response является незашифрованной длиной ответа HTTP.

Этот ответ может не содержать всю необходимую информацию, но должен каким-то образом объяснить поведение, которое вы видите.

+0

@njoyce: спасибо за объяснение и за ссылку. Это проливает свет на эту проблему. Мне интересно, можно ли принудительно принять сертификат. Если я попытаюсь получить доступ к этому шлюзу из приложения Flex через браузер, меня попросят принять сертификат. Изучив API RemotingService, я не видел способа заставить клиента python принимать сертификат. Пожалуйста, поделитесь своими мыслями. –

 Смежные вопросы

  • Нет связанных вопросов^_^