使用带 SSL 的 IAM 身份验证连接到 AWS 中的 Postgres 数据库

时间:2021-03-23 21:28:20

标签: c# postgresql amazon-rds npgsql

我有一个运行 Postgres 的 RDS 实例,它启用了 IAM 身份验证。我可以通过 powershell 使用 IAM 令牌成功连接,但是在尝试使用 Npgsql 库与 Visual Studio 2019 版本 16.8.5(在.Net 框架 4.8)。

注意,我一直在参考这个 AWS 页面,它提供了证书的下载链接。 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html

我也一直在参考此页面来指导我完成此设置。 https://aws.amazon.com/premiumsupport/knowledge-center/rds-postgresql-connect-using-iam/


我可以使用 PowerShell 连接:

$ENV:RDSHOST="my-postgres-instance.eu-west-1.rds.amazonaws.com"
$ENV:PGPASSWORD="$(aws rds generate-db-auth-token --hostname $ENV:RDSHOST --port 5432 --region eu-west-1 --username my_db_user)"
psql -h $ENV:RDSHOST -p 5432 "sslmode=verify-full sslrootcert=rds-ca-2019-root.pem dbname=my_db user=my_db_user password=$ENV:PGPASSWORD"

但是,当我尝试使用 Npgsql 库和以下代码打开与 C# 的连接时,出现异常:

var host = "my-postgres-instance.eu-west-1.rds.amazonaws.com";
var port = 5432;
var user = "my_db_user";

var token = RDSAuthTokenGenerator.GenerateAuthToken(RegionEndpoint.EUWest1, host, port, user);

var builder = new NpgsqlConnectionStringBuilder
{
    Host = host,
    Port = port,
    Database = "my_db",
    Username = user,
    Password = token,
    SslMode = SslMode.Require,
    RootCertificate = @"C:\Path\To\Cert\rds-combined-ca-bundle.pem",
};

using (var conn = new NpgsqlConnection(builder.ConnectionString))
{
    conn.Open();
}
<块引用>

Npgsql.NpgsqlException: '执行 SSL 握手时出现异常
AuthenticationException: 根据验证程序,远程证书无效。

值得注意的是,我可以连接设置TrustServerCertificate = true,但据我所知,这掩盖了问题并降低了安全性,不可取。

上面链接的 AWS 页面提到:

<块引用>

如果您的应用程序在 Microsoft Windows 上并且需要 PKCS7 文件,您可以下载 PKCS7 证书包。此捆绑包包含 https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.p7b 处的中间证书和根证书。

我已尝试将此 p7b 文件指定为 NpgsqlConnectionStringBuilder.ClientCertificate,但这会在打开连接时导致不同的异常:

<块引用>

Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: '找不到原始签名者。'


谁能帮助我了解如何连接?值得注意的是,我对建立 SSL 连接或处理证书不是很熟悉,所以请记住这一点。

0 个答案:

没有答案