Ошибка TimeoutError, соединяющаяся с сервером базы данных Zope ZEO через сертификат клиента ssl в Python3 - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь подключиться к базе данных ZODB через клиент-серверный соединитель ZEO .

Я могу подключиться к серверу Zeo с использованием незашифрованного TCP-штрафа.

client_storage = ZEO.client(("server.com",8090))

Затем я включаю аутентификацию клиента ssl в файле конфигурации Zeo-сервера:

...
  <ssl>
    certificate /etc/letsencrypt/live/server.com/fullchain.pem
    key /etc/letsencrypt/live/server.com/privkey.pem
    authenticate /etc/zeo/auth/client.pem
  </ssl>
...

Используя openssl, я создал подписанный сертификат клиента с использованием сертификата сервера LetsEncrypt:

openssl genrsa -out client.key 4096
openssl req -config /root/ca/openssl.conf -key client.key -new -sha256 -out client-req.pem
openssl ca -config /root/ca/openssl.conf -extensions usr_cert -days 375 -notext -md sha256 -in client-req.pem -out client.pem

/ root / ca / ​​openssl.conf указывает на сертификат сервера LetsEncrypt в качестве промежуточного CA.

В качестве теста я CAN подключение к серверу Zeo с использованием Python3 ssl обычно:

root = "mycerts"
cafile = os.path.join(root, "fullchain.pem")
certfile = os.path.join(root, "client.pem")
keyfile = os.path.join(root, "client.key")

context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=cafile)
context.load_default_certs()  #  Omitting this line breaks things
context.load_cert_chain(certfile=certfile, keyfile=keyfile)

host_addr = 'server.com'
host_port = 8090

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn = context.wrap_socket(s, server_side=False, server_hostname=host_addr)
conn.connect((host_addr, host_port))

Но, если я использую Zeo:

root = "mycerts"
cafile = os.path.join(root, "fullchain.pem")
certfile = os.path.join(root, "client.pem")
keyfile = os.path.join(root, "client.key")

context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=cafile)
context.load_default_certs()  #  Omitting this line breaks things
context.load_cert_chain(certfile=certfile, keyfile=keyfile)

host_addr = 'server.com'
host_port = 8090
client_storage = ZEO.client((host_addr, host_port), ssl=context)

Проблема в том, что я всегда получаю 'TimoutError'

Похоже, что не имеет значения, если я также предоставлю ssl_server_hostname = host_addr

Глядя на код Zeo, он использует asyncio create_connection (), но в остальномпередает контекст ssl как есть.

Я также проверил fullchain.pem и client.pem иони хороши, их цепь завершена.

Что я делаю не так?

...