Npgsql提供客户端证书和密钥

时间:2020-01-20 19:09:19

标签: postgresql entity-framework entity-framework-core npgsql

我正在尝试与需要客户端证书和密钥才能操作的PGSQL服务器建立连接。


首先,我可以使用SQLGate工作来验证与Postgres数据库的连接。提供主机,用户,密码,端口,数据库并标记使用SSL,然后在SSL下提供证书和密钥。没有这些项目中的任何一项,连接将无法运行。使用NPGSQL,我提供了除密钥以外的所有密钥,因为某些原因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's PG Connect documentation将其标记为sslkey,但返回时也无法识别。我最好的猜测是使用ProvideClientCertificatesCallback回调提供证书,但是我不知道如何将它与密钥配对,因为它只是在请求X509CertificateCollection

我们先前使用的工具是由Devart提供的,但是我们丢失了许可证。我们还将连接到一系列数据库(具有相同的架构),而不仅仅是一个数据库。

我有什么选择?

0 个答案:

没有答案