Я пытаюсь сформулировать соединение с сервером 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, но мы потеряли лицензию. Мы также будем подключаться к ряду баз данных (с одной и той же схемой) вместо одной.
Какие у меня варианты?