Comme beaucoup de gens, j'ai reçu un e-mail me disant de mettre à jour mon instance RDS pour utiliser le nouveau certificat rds-ca-2019 pour les connexions SSL (le précédent étant rds-ca-2015 qui expire le 5 mars 2020). Leur documentation sur le processus est un peu clairsemé et dit des choses comme "Mettez à jour vos applications de base de données pour utiliser le nouveau certificat SSL/TLS." et "Importez le certificat dans votre système d'exploitation." sans plus de détails sur les changements requis du côté client.
Lors de la configuration initiale, je n'ai installé aucun certificat et utilisé une image Vanilla Ubuntu 18.04 EC2. L'instance RDS a été définie pour utiliser rds-ca-2015 et lorsque je me suis connecté à RDS avec psql, il a signalé qu'il utilisait correctement TLSv1.2. Si je regarde les certificats racine installés dans le système d'exploitation, je trouve 4 certificats "Amazon Root CA" numérotés de 1 à 4. Ceux-ci n'expirent pas avant 2038 et 2040.
Donc, ma question comprend 2 parties:
Le par défaut sslmode
pour PostgreSQL est prefer
ce qui signifie qu'il cryptera la connexion avec le certificat fourni par le serveur mais ne le vérifiera pas. Si je devais changer le paramètre sslmode
en verify-ca
ou verify-full
alors j'aurais besoin d'installer les certificats intermédiaires dans un répertoire particulier et ensuite il ferait une vérification correcte.
Comme je ne suis pas préoccupé par une attaque MITM sur mon VPC, je ne pense pas que je vais prendre la peine de passer au mode `` vérifier ''.
Le certificat RDS en question est un certificat intermédiaire . Vous pouvez également le connaître en tant que certificat CA. Lorsque j'utilise MySQL Workbench, par exemple, je dois spécifier que
Comment le SSL/TLS fonctionnait-il correctement au départ si je n'avais jamais installé le [certificat]?
Cela dépend de la configuration de votre système. Les certificats CA fournissent simplement une autorité de confiance pour le certificat présenté. Il est tout à fait possible de configurer quelque chose qui acceptera n'importe quel certificat, sans tenter de le vérifier (c'est-à-dire que vous utilisez un certificat auto-signé). Une autre option est qu'il existe déjà quelque chose dans votre magasin CA qui lui fait confiance implicitement. C'est moins probable, mais pas impossible.
Si vous faites cela localement (comme vous avez une instance EC2 dans le même VPC que votre instance RDS), vous n'aurez peut-être même pas besoin de SSL.
Si j'ai changé l'instance de base de données RDS pour utiliser rds-ca-2019 et que cela semble "fonctionner", y a-t-il autre chose à faire?
Non, c'est déroutant, mais si vous vous connectez et que vous n'obtenez aucune erreur de certificat, je ne m'en inquiéterais pas.
Dans ubuntu, ajoutez le ca-cert comme décrit ici: 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.
Ce lien décrit comment définir l'emplacement du certificat SSL pour une application Django: 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')
}
Ce message dans Stackoverflow https://stackoverflow.com/a/58214922/1415254 décrit comment se connecter en utilisant les paramètres de ligne de commande pour psql.
psql "Host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} \
sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} \
dbname={db}"
Aussi
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.
Et plus de détails ici (tout à la fin): 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"
Liste complète des variables d'environnement ici: https://www.postgresql.org/docs/9.2/libpq-envars.html
Cette mise à jour du certificat présente deux aspects:
Postgres utilise "prefer" comme moyen par défaut pour les clients de se connecter, ce qui signifie qu'ils essaieront SSL si disponible, mais se replieront sinon. Ainsi, les clients existants avec une configuration de connexion par défaut continueront de fonctionner.
Tout comme l'OP post lui-même, postgres a le sslmode par défaut défini sur prefer
, et voici l'extrait du document:
I don't care about encryption, but I wish to pay the overhead of encryption if the server supports it.
Ainsi, par défaut, le pilote pg ne vérifiera pas les certificats sauf indication contraire; et c'est exactement la raison pour laquelle les questions originales d'OP fonctionnent au départ, et fonctionnent également après la mise à niveau du RDS vers rds-ca-2019
.
L'une des variables d'environnement pour la connexion à postgres est via DATABASE_URL
, sous la forme de
postgres://username:password@Host/database?sslmode=verify-full&sslrootcert=config/ca/rds-combined-ca-bundle.pem
et c'est là que vous pouvez spécifier les sslmode
et sslrootcert
si vous décidez de vérifier les certificats intermédiaires. Le contenu de sslrootcert
doit être l'un des suivants ...
https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
HTH
Avant de mettre à niveau l'autorité de certification dans RDS vers rds-ca-2019, sans interruption de connexion, vous pouvez mettre à niveau le certificat côté client.
Si votre RDS a rds-ca-2015, vous devez mettre à niveau la clé côté client avec ceci https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem .
Selon le document AWS https://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html Il indique que le fichier rds-combine-ca-bundle.pem a les deux certificats intermédiaires et racine.
Une fois que vos applications ont un fichier ca combiné, vous devez procéder à la mise à niveau de votre RDS vers l'autorité de certification rds-ca-2019.
De cette façon, sans temps d'arrêt, vous pouvez mettre à niveau l'autorité de certification dans RDS vers rds-ca-2019.
Toute nouvelle instance de base de données RDS créée après le 1er novembre 2019 utilise les nouveaux certificats par défaut. Si votre instance RDS est créée avant la date susmentionnée, vous devez mettre à jour le certificat.
Pour changer l'autorité de certification de rds-ca-2015 à rds-ca-2019 pour une instance de base de données