我有一个运行 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 连接或处理证书不是很熟悉,所以请记住这一点。