“请在 2019 年 10 月 31 日前更新您的 Amazon RDS SSL/TLS 证书”

“请在 2019 年 10 月 31 日前更新您的 Amazon RDS SSL/TLS 证书”

我和很多人一样,收到了一封电子邮件,说要更新我的 RDS 实例以使用新的 rds-ca-2019 证书进行 SSL 连接(之前是 rds-ca-2015,将于 2020 年 3 月 5 日到期)。他们的有关流程的文档有点稀疏,只说了诸如“更新您的数据库应用程序以使用新的 SSL/TLS 证书。”和“将证书导入您的操作系统。”之类的内容,而没有关于客户端所需更改的更多详细信息。

当我最初设置时,我没有安装任何证书,而是使用了 vanilla Ubuntu 18.04 EC2 映像。RDS 实例设置为使用 rds-ca-2015,当我使用 psql 连接到 RDS 时,它报告它正确使用了 TLSv1.2。如果我查看操作系统中安装的根证书,我会发现 4 个“Amazon Root CA”证书,编号为 1 到 4。这些证书要到 2038 年和 2040 年才会过期。

因此,我的问题分为两部分:

  1. 如果我从未安装过 SSL/TLS,它最初是如何正常工作的Amazon 提供的 RDS 证书和中间证书
  2. 如果我已将 RDS 数据库实例更改为使用 rds-ca-2019,并且它似乎“正常工作”,我还需要做什么吗?

答案1

sslmodePostgreSQL 的默认设置是prefer这意味着它将使用服务器提供的证书加密连接,但不会对其进行验证。如果我将设置更改sslmodeverify-ca或,verify-full则需要在特定目录中安装中间证书,然后它才会进行正确的验证。

由于我不担心我的 VPC 遭受 MITM 攻击,因此我认为我不会费心切换到“验证”模式。

答案2

有问题的 RDS 证书是中间的证书。您可能也知道它是 CA 证书。例如,当我使用 MySQL Workbench 时,我必须指定

  1. 我想使用 SSL(TLS)
  2. 使用 RDS CA 链文件验证证书

MySQL 工作台

如果我从未安装过 [证书],SSL/TLS 最初如何正常工作?

取决于你的系统如何设置。CA 证书只是提供值得信赖的权威机构对于所呈现的证书。完全可以设置某种东西来接受任何证书,而无需尝试验证它(即您使用自签名证书)。另一种选择是您的 CA 存储中已经存在隐式信任它的东西。这种情况不太可能,但并非不可能。

如果您在本地执行此操作(例如,您在与 RDS 实例相同的 VPC 中有一个 EC2 实例),则甚至可能不需要 SSL。

如果我已将 RDS 数据库实例更改为使用 rds-ca-2019,并且它似乎“正常工作”,我还需要做什么吗?

不。这很令人困惑,但如果您正在连接并且没有收到任何证书错误,我就不用担心了。

答案3

在 ubuntu 中,按照此处所述添加 ca-cert: https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate

wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
sudo mkdir /usr/local/share/ca-certificates/aws
sudo mv rds-ca-2019-root.pem /usr/local/share/ca-certificates/aws
sudo openssl x509 \ 
    -in /usr/local/share/ca-certificates/aws/rds-ca-2019-root.pem \
    -inform PEM \
    -out /usr/local/share/ca-certificates/aws/rds-ca-2019-root.crt
sudo update-ca-certificates

: sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:rds-ca-2019-root.pem
done.
done.

此链接描述了如何为 django 应用程序设置 ssl 证书位置: https://www.digitalocean.com/community/questions/how-to-connect-managed-database-postgres-with-ssl-mode-varify-full-in-django-app

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': '<name>',
    'USER': '<user>',
    'PASSWORD': '<password>',
    'HOST' : '<host>',
    'PORT' : '25060',   
    'OPTIONS':{
        'sslmode':'verify-full',
        'sslrootcert': os.path.join(BASE_DIR, 'ca-certificate.crt')

}

Stackoverflow 上的这篇文章https://stackoverflow.com/a/58214922/1415254描述如何使用 psql 的命令行参数进行连接。

psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} \
sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} \
dbname={db}"

psqlrc and ~/.psqlrc

Unless it is passed an -X or -c option, psql attempts to read and execute commands
from the system-wide startup file (psqlrc) and then the user's personal startup
file (~/.psqlrc), after connecting to the database but before accepting normal
commands. These files can be used to set up the client and/or the server to taste,
typically with \set and SET commands.

更多详细信息请见此处(最后):https://info.crunchydata.com/blog/ssl-certificate-authentication-postgresql-docker-containers

# the first parameter specifies which TLS mode to use to connect
export PGSSLMODE="verify-full"
# the following two parameters point to the client key/certificate
export PGSSLCERT="`pwd`/certs/client.crt"
export PGSSLKEY="`pwd`/keys/client.key"
# this parameter points to the trusted root CA certificate
export PGSSLROOTCERT="`pwd`/certs/ca.crt"

完整的环境变量列表在这里:https://www.postgresql.org/docs/9.2/libpq-envars.html

答案4

此次证书更新涉及两个方面:

  1. 在服务器端:2019-11-01 之前创建的任何 RDS 实例都需要重新启动。这会导致约 5 分钟的中断。这将更新它们以使用新证书。
  2. 如果您的客户端使用 SSL(默认关闭/首选),那么您需要在客户端运行的任何地方从 AWS 更新证书(中间+链)。

Postgres 使用“首选”作为客户端连接的默认方式,这意味着如果可用,它们将尝试 SSL,但如果不可用,则回退。因此,具有默认连接配置的现有客户端将继续运行。

相关内容