sql >> Database >  >> RDS >> PostgreSQL

Hoe verbinding maken met PostgreSQL vanuit Phoenix Web App via SSL?

Achtergrond

Ik ondervond hetzelfde probleem bij het verbinden van Phoenix/Ecto/Postgrex met Azure Database for PostgreSQL-server. Zelfs na het instellen van ssl: true in mijn Repo-configuratie kon ik nog steeds geen verbinding maken met de database met Postgrex, hoewel ik verbinding maakte met psql "postgresql://...?sslmode=require" -U ... op dezelfde machine gelukt. De fout geretourneerd met ssl: true was:

[error] Postgrex.Protocol (#PID<0.1853.0>) failed to connect: **(DBConnection.ConnectionError) ssl connect: closed

** (DBConnection.ConnectionError) connection not available because of disconnection
    (db_connection) lib/db_connection.ex:926: DBConnection.checkout/2
    ...

Nadat ik de broncode had doorzocht, ontdekte ik dat de mislukte oproep eigenlijk de ssl.connect/3 was oproep van de Erlang ssl-module :

# deps/postgrex/lib/postgrex/protocol.ex:535

defp ssl_connect(%{sock: {:gen_tcp, sock}, timeout: timeout} = s, status) do
  case :ssl.connect(sock, status.opts[:ssl_opts] || [], timeout) do
    {:ok, ssl_sock} ->
      startup(%{s | sock: {:ssl, ssl_sock}}, status)
    {:error, reason} ->
      disconnect(s, :ssl, "connect", reason)
  end
end

Toen ik wat rondsnuffelde met Wireshark, kon ik dat zien toen ik succesvol verbinding maakte met psql , ik kon pakketten zien met TLSV1.2 als het protocol, maar toen postgrex verbinding maakte met ssl: true Ik zag pakketten met SSL als het protocol voordat er geen verbinding kan worden gemaakt.

Kijkend naar de Ecto.Adapters.Postgres optiedocumenten , zul je zien dat er een ssl_opts . is configuratie-optie die uiteindelijk wordt doorgegeven aan :ssl.connect/3 waarin u versions . kunt instellen om de TLS-versie(s) die zijn gebruikt om verbinding te maken te negeren.

Oplossing

Ik kon verbinding maken met de database door het volgende toe te voegen aan mijn Repo-configuratie:

ssl_opts: [
  versions: [:"tlsv1.2"]
]

Mijn volledige configuratie zag er uiteindelijk zo uit:

config :myapp, Myapp.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "[email protected]",
  password: "...",
  database: "myapp_dev",
  port: 5432,
  hostname: "dev-db.postgres.database.azure.com",
  pool_size: 10,
  ssl: true,
  ssl_opts: [
    versions: [:"tlsv1.2"]
  ]

Ik weet niet precies waarom de TLS-versie expliciet moet worden ingesteld, misschien kan iemand met meer expertise op dit gebied hier enig licht op werpen.



  1. Wat is het verschil tussen het 'yy'- en 'rr'-datummasker van orakel?

  2. Verwijzing naar een externe sleutel naar een tabel in een ander schema

  3. MySQL 1292 Onjuiste datetime-waarde

  4. Te veel automatische verhogingen met ON DUPLICATE KEY UPDATE