Где (в какой точке кода) клиент pyAMF принимает сертификат SSL?

Я настроил сервер, прослушивающий порт 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')

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

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:56,467 DEBUG [root] Чтение 41 байта для ответа выглядит подозрительно, так как ответ слишком короткий (сертификат ~1 КБ), и я ожидаю, что передача сертификата будет в журнал отладки.

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

1 ответ

Решение

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

В документации говорится, что (со ссылкой на HTTPSConnection):

Примечание: это не делает никакой проверки сертификата

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

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

[root] Отправка POST-запроса в /gateway

Read 41 bytes for the response длина незашифрованного http ответа.

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

Другие вопросы по тегам