Найти тему

Как настроить использование ssl в SQLAlchemy с asyncpg

Предисловие.

Здравствуй читатель. Сегодня передо мной встала задача настроить подключение к postgresql по ssl. И... и я довольно много времени потратил чтобы понять как это делается, по этой причине решил вкратце рассказать.

1. Создание и установка сертификатов и ключей на БД postgreSQL.

Эта задача не слишком сложная. можно найти уйму гайдов в интернете на эту тему, или если понимания хватает почитать официальную документацию(тык. https://www.postgresql.org/docs/current/ssl-tcp.html) и сделать как там написано.

2. Настройка подключения по ssl в sqlalchemy.

Ооо.. вот на это я пожалуй убил уйму времени, читая различные ответы на сайтах по типу stackoverflow, и пытаясь найти где же об этом говорится в документации SQLAlchemy. Да, в документации можно найти использование вместе с pg8000, однако pg8000 написан полностью на Python, что обозначает - меньше скорость по сравнению с другими решениями, и плюсом насколько я понимаю отсутствие асинхронности.

Решение я нашел, когда тестировал с параметрами, и передал ssl=verify-ca, увидев что он не находит в определенном каталоге ключ. Потом вспомнив что можно найти на документации psycopg2(отказался от него в связи с тем, что он почему то требует ключ центра сертификации) немного поэкспериментировав решение нашлось.

для подключения необходимо использовать url такого типа: postgresql+asyncpg://<user>:<password>@localhost/<dbname>?ssl=<sslmode>.

где sslmode берем от сюда https://www.postgresql.org/docs/current/libpq-ssl.html если не охота читать, то берем просто verify-ca - в этом режиме клиент будет проверять цепочку сертификатов вплоть до корневого, хранящегося на клиенте.

далее если мы запустим код просто так, то увидим ошибку, что root.crt не найден по определенному адресу, туда его и надо будет положить. В Linux это /home/<user>/.postgresql/ там должен будет находиться root.crt, т.к. asyncpg будет искать его там.

Ну вот и все. Если это будет действительно интересно кому-либо, то можно добавить раздел с созданием и установкой сертификатов, хотя мне кажется если кто то это читает, то он вероятно точно с этим разберется сам, единственная проблема, с которой я столкнулся это было куда же запихнуть этот сертификат CA. Но, в самом деле читать текст на привычном языке немного удобнее, и если постараться можно сократить текст из оф документации и сделать узконаправленный гайд по настройке ssl c postgresql в SQLAlchemy. Пишите, что думаете, но если что это моя первая статья.

*Мой небольшой код для тестов: