Где (в какой точке кода) клиент 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 ответа.
Этот ответ может не содержать всю необходимую вам информацию, но должен помочь объяснить поведение, которое вы видите.