Я пытаюсь подключиться к базе данных 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 иони хороши, их цепь завершена.
Что я делаю не так?