wake-up-neo.com

“在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. 如果我从未安装过 Amazon提供的RDS证书和中间证书 ,则SSL/TLS最初如何正常工作?
  2. 如果我已将RDS数据库实例更改为使用rds-ca-2019,并且似乎“正常工作”,我还需要做更多的事情吗?
19
Tim Tisdall

PostgreSQL的默认sslmodeprefer 表示这将使用服务器提供的证书对连接进行加密,但不会对其进行验证。如果我要将sslmode设置更改为verify-ca 要么 verify-full,那么我将需要在特定目录中安装中间证书,然后它将进行正确的验证。

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

13
Tim Tisdall

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

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

MySQL Workbench

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

取决于系统的设置方式。 CA证书只是为显示的证书提供可信授权。很有可能会设置某种东西,使其完全接受任何证书,而无需尝试对其进行验证(即,您使用自签名证书)。另一个选择是,您的CA存储中已经存在一些隐式信任它的东西。这不太可能,但并非不可能。

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

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

不会。这很令人困惑,但是如果您正在连接并且没有出现任何证书错误,那么我就不必担心。

7
Machavity

在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应用程序: https://www.digitalocean.com/community/questions/how-to-connect-managed-数据库-postgres-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
vinh

此证书更新有两个方面:

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

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

2
Ron Wail

就像OP回答自己一样,postgres的默认sslmode设置为prefer,这是文档的摘录:

I don't care about encryption, but I wish to pay the overhead of encryption if the server supports it.

因此,默认情况下,除非指定,否则pg驱动程序将不验证证书。这正是OP最初提出的问题的原因,它一开始就可以立即使用,并且在RDS升级到rds-ca-2019之后也可以使用。

用于连接到postgres的环境变量之一是通过DATABASE_URL,形式为

postgres://username:[email protected]/database?sslmode=verify-full&sslrootcert=config/ca/rds-combined-ca-bundle.pem

如果您决定验证中间证书,则可以在此处指定sslmodesslrootcertsslrootcert的内容应为以下内容之一...

https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

高温超导

2
MrAtheist

在不中断连接的情况下,将RDS中的证书颁发机构升级到rds-ca-2019之前,您可以在客户端上升级证书。

如果您的RDS具有rds-ca-2015,则应使用 https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem 升级客户端密钥。 。

根据AWS文档 https://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html 它说rds-combined-ca-bundle.pem文件具有两个证书中间和根。

应用程序合并CA文件后,您应继续将RDS升级到证书颁发机构rds-ca-2019。

这样,您无需停机即可将RDS中的证书颁发机构升级到rds-ca-2019。

1
Piyush Sonigra

在2019年11月1日之后创建的任何新RDS数据库实例,默认情况下都使用新证书。如果您的RDS实例是在上述日期之前创建的,则需要更新证书。

要将数据库实例的证书颁发机构从rds-ca-2015更改为rds-ca-2019

  1. 登录到AWS管理控制台并通过 https://console.aws.Amazon.com/rds/ 打开Amazon RDS控制台。
  2. 在导航窗格中,选择“数据库”,然后选择要修改的数据库实例。
  3. 选择修改。出现“修改数据库实例”页面。参考附件
  4. 在``网络和安全性''部分中,选择rds-ca-2019。请参阅附件。
  5. 选择继续,然后检查修改摘要。
  6. 要立即应用更改,请选择“立即应用”。选择此选项会导致中断。
  7. 在确认页面上,查看您的更改。如果正确,请选择“修改数据库实例”以保存更改。
0
Mohan Balakrishnan