Asp.net core как подключиться к кластеру PostgreSql (Cloud.Yandex)

И так друзья, у вас приложение asp.net core 2, 3 на линуксе (Linux) и вы хотите подключиться к кластеру Postgresql на базе Cloud.Yandex. Я как и многие из нас не люблю возиться с настройками среды, поэтому поспешил глянуть инструкцию в яндекс облаке. Но эти придурки из яндекса (да да любить из незачто :-)) не оставили инструкции подключения для нашего asp.net core.

Я им даже писал в поддержку мол «ваш клиент, может расскажите как подключиться по бырому?». На что мне ответили — «спасибо», а потом —«ваша заявка выполнена». Но инструкции так и не появилось. Просто уроды что можно сказать.

нет инструкции подключения к postgresql кластеру от яндекс облако

Итак как подключиться к кластеру postgresql используя asp.net core и Ubuntu?

Для начала установите на своем сервер сертификат. Выполните следующую команду.

mkdir -p ~/.postgresql && \ wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O ~/.postgresql/root.crt && \ chmod 0600 ~/.postgresql/root.crt

Данная команда добавит в папку /home/username/ .postgresql сертификат root.crt

Для работы с базой Postgresql я использую библиотеку «Npgsql.EntityFrameworkCore.PostgreSQL«, которая заточена под ORM Entity Framework.

Моя строка соединения. Для читабельности добавил переносы. Подробнее про строку соединения можно почитать тут

Host=rc4c-blablablablabla.mdb.yandexcloud.net;Port=6432;
SSLMode=Require; //
TrustServerCertificate=true;
Database=YOUR_DB_NAME;
Username=YOUR_DB_USERNAME;
Password=*******;
Pooling=true;

Чтобы соединение работало надо в option builder-е проставить делегаты. RemoteCertificateValidationCallback и ProvideClientCertificatesCallback

public async Task<ActionResult<bool>> CanConnect()
{
            const string host = "rc4c-blablablablabla.mdb.yandexcloud.net";
            var connection =
                $"Host={host};Port=6432;SSLMode=Require;TrustServerCertificate=true;Database=YOUR_DB_NAME;Username=YOUR_DB_USERNAME;Password=*******;Pooling=true;";

            var optionsBuilder = new DbContextOptionsBuilder<DbAppContext>();
            optionsBuilder.UseNpgsql(connection, builder =>
            {
                builder.RemoteCertificateValidationCallback((s, c, ch, sslPolicyErrors) =>
                {
                    if (sslPolicyErrors == SslPolicyErrors.None)
                    {
                        return true;
                    }
                    _logService.Error($@"Certificate error: {sslPolicyErrors}, 
                    Do not allow this client to communicate with unauthenticated servers");
                    return false;
                });

                builder.ProvideClientCertificatesCallback(clientCerts =>
                {
                    var clientCertPath = "/home/username/.postgresql/root.crt";
                    // To avoid permission ex run: "sudo chmod -R 777 /home/username/.postgresql/root.crt"
                    var cert = new X509Certificate2(clientCertPath);
                    clientCerts.Add(cert);
                });
            });

            using (var ctx = new DbAppContext(optionsBuilder.Options))
            {
                return await ctx.Database.CanConnectAsync();
            }
  }

Error:2006D002:BIO routines:BIO_new_file:system

В процессе настройки у меня вылетала вот такая ошибка error:2006D002:BIO routines:BIO_new_file:system. Оказалось для файла сертификата, который используется в классе X509Certificate2 не было прав на чтение. Пока пофиксил данную проблему просто дав права файлу на сервере.

sudo chmod -R 777 /home/username/.postgresql/root.crt

Comments are closed.