पृष्ठभूमि
मैं PostgreSQL सर्वर के लिए फीनिक्स/एक्टो/पोस्टग्रेक्स को Azure डेटाबेस से जोड़ने में एक ही समस्या का सामना कर रहा था। ssl: true
. सेट करने के बाद भी मेरे रेपो कॉन्फ़िगरेशन में, मैं अभी भी पोस्टग्रेक्स के साथ डेटाबेस से कनेक्ट करने में सक्षम नहीं था, हालांकि psql "postgresql://...?sslmode=require" -U ...
का उपयोग करके कनेक्ट कर रहा था। उसी मशीन पर सफल हुआ। ssl: true
. के साथ वापस आई त्रुटि था:
[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
...
स्रोत कोड के माध्यम से खोदने के बाद, मुझे पता चला कि असफल कॉल वास्तव में ssl.connect/3
थी एरलांग ssl मॉड्यूल
से कॉल करें :
# 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
Wireshark के साथ कुछ जासूसी करते हुए, मैं यह देखने में सक्षम था कि psql
के साथ सफलतापूर्वक कनेक्ट होने पर , मैं TLSV1.2
. के साथ पैकेट देख सकता था प्रोटोकॉल के रूप में, लेकिन जब पोस्टग्रेक्स ssl: true
. से जुड़ रहा था मैं SSL
वाले पैकेट देख रहा था कनेक्ट करने में विफल होने से पहले प्रोटोकॉल के रूप में।
Ecto.Adapters.Postgres options docs
देख रहे हैं , आप देखेंगे कि एक ssl_opts
है कॉन्फ़िगरेशन विकल्प जो अंत में :ssl.connect/3
. को पास हो जाता है जिसमें आप versions
. सेट कर सकते हैं कनेक्ट करने के लिए उपयोग किए जाने वाले TLS संस्करण (संस्करणों) को ओवरराइड करने के लिए।
समाधान
मैं अपने रेपो कॉन्फ़िगरेशन में निम्नलिखित जोड़कर डेटाबेस से जुड़ने में सक्षम था:
ssl_opts: [
versions: [:"tlsv1.2"]
]
मेरा पूरा कॉन्फ़िगरेशन इस तरह दिखने लगा:
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"]
]
मुझे सच में यकीन नहीं है कि टीएलएस संस्करण को स्पष्ट रूप से सेट करने की आवश्यकता क्यों है, शायद इस क्षेत्र में अधिक विशेषज्ञता वाला कोई व्यक्ति इस पर कुछ प्रकाश डाल सकता है।