Npg sql Предоставить клиентский сертификат и ключ - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь сформулировать соединение с сервером PG SQL, для работы которого требуется сертификат клиента и ключ.


Сначала я могу проверить соединения с базой данных Postgres, используя SQLGate работает. Укажите хост, пользователя, пароль, порт, базу данных и отметку Использовать SSL, затем в разделе SSL укажите Сертификат и Ключ. Соединение не работает без этих пунктов. Используя NPG SQL, я предоставляю все, кроме ключа, поскольку по какой-то причине NpgsqlConnectionStringBuilder не содержит определения для какого-либо клиентского ключа.

var connectionString = new NpgsqlConnectionStringBuilder();
connectionString.Host = rInfo.Host;
int portNumber = 5432;
int.TryParse(rInfo.Port, out portNumber);
connectionString.Port = portNumber;
connectionString.Database = rInfo.dbName;
connectionString.Username = rInfo.Username;
connectionString.Password = rInfo.Password;
connectionString.SslMode = SslMode.Prefer;
connectionString.TrustServerCertificate = true;
connectionString.ClientCertificate = rInfo.CertFilePath;
//Poke the database, see if we can get in.
try
{
    NpgsqlConnection npgsqlConnection = new NpgsqlConnection(connectionString.ToString());
    npgsqlConnection.ProvideClientCertificatesCallback += provideCertificates;
    npgsqlConnection.UserCertificateValidationCallback += validateCertificates;
    npgsqlConnection.Open();
    npgsqlConnection.Close();
    return connectionString.ToString();
}

Исключение составляет:

Ошибка 28000: для подключения требуется действительный сертификат клиента

Что и следовало ожидать, поскольку я нигде не предоставляю ключ. Я попытался принудительно добавить ключ к строке подключения, угадав:

connectionString.Add(new KeyValuePair<string, object?>("Client Key", rInfo.KeyFilePath));

Но это не распознается. Документация Libpq для PG Connect помечает его как sslkey, но это также считается нераспознанным. Мое лучшее предположение - использовать обратный вызов ProvideClientCertificatesCallback для предоставления сертификата, но я не знаю, как связать его с ключом, поскольку он просто запрашивает X509CertificateCollection.

Предыдущий инструмент, который мы использовали был предоставлен Devart, но мы потеряли лицензию. Мы также будем подключаться к ряду баз данных (с одной и той же схемой) вместо одной.

Какие у меня варианты?

...