PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एसएसएल के माध्यम से फीनिक्स वेब ऐप से पोस्टग्रेएसक्यूएल से कैसे कनेक्ट करें?

पृष्ठभूमि

मैं 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"]
  ]

मुझे सच में यकीन नहीं है कि टीएलएस संस्करण को स्पष्ट रूप से सेट करने की आवश्यकता क्यों है, शायद इस क्षेत्र में अधिक विशेषज्ञता वाला कोई व्यक्ति इस पर कुछ प्रकाश डाल सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy से COUNT प्राप्त करना

  2. PostgreSQL - सांख्यिकीय डेटा प्राप्त करना

  3. PostgreSQL तालिका के लिए कितना बड़ा है?

  4. पोस्टग्रेज संबंध में ALTER TYPE पर त्रुटि मौजूद नहीं है

  5. मैं कपड़े के साथ एक पोस्टग्रेस्क्ल उपयोगकर्ता कैसे बना सकता हूं