The-Han-Emperor
The-Han-Emperor

Reputation: 357

psycopg2.OperationalError: FATAL: unsupported frontend protocol 1234.5679: server supports 2.0 to 3.0

I'm using Macbook

Psycopg2 works well when connecting the localhost db (PostgreSQL on Mac). The error was raised when I tried to connect PostgreSQL db on a Windows10.

the following code is what I have for connection, the host is just the IP of the windows10

db= psycopg2.connect(database='dbname',user='username',password="secret",host="192.168.3.9",port="5432")

Errors:

  File "path/to/psycopg2/__init__.py", line 126, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  unsupported frontend protocol 1234.5679: server supports 2.0 to 3.0

Is this because of system compatibility or something else? I've tried other Windows machine and I got no luck to make it work. However, I was able to connect PostgreSQL on windows while I using Node.JS module pg

Upvotes: 16

Views: 29100

Answers (6)

If you installed this Psycopg2 module through conda command, then uninstall that module and install using pip command.

Command: pip install Psycopg2

The above command may resolve your issue. I resolved through this step

Upvotes: 2

ukaliko
ukaliko

Reputation: 180

Using PostgresSQL 13.0 I had the same problem, displaying the error messages:

 unsupported frontend protocol 255.255: server supports 2.0
 unsupported frontend protocol 0.0: server supports 2.0 to

according to this site it postgresql.org deals with the SSL / GSS Protocol Negotiation Problem. Which should already be resolved in Postgres version 12.0

I was able to solve it following the guidelines contained in these sites: highgo.ca

In the postgres terminal, I executed the command below setting the environment variable gssencmode = disable and the problem was solved:

  psql -h localhost -U postgres -d "dbname=belez gssencmode=disable";

Upvotes: 1

Hervé Mignot
Hervé Mignot

Reputation: 331

In order to have a SSL connection working and using certificates, you can disable GSS connection mode to avoid the client to attempt to connect with GSS and directly try a SSL connection (Postgres version 12 < 12.3, I had no such issues with a test on version 11).

Below an example with the verify-ca option, providing filenames for certificates and key (example names from GCP Cloud SQL, running Postgres 12.1 when posted).

   from sqlalchemy import create_engine

   db_user = 'user'
   db_pwd = 'secret'
   db_host = 'hostname'
   db_port = '5432'
   db_name = 'test'

   cnn = f'postgresql://{db_user}:{db_pwd}@{db_host}:{db_port}/{db_name}'
   ssl_args = {
       'gssencmode': 'disable',
       'sslmode': 'verify-ca',
       'sslrootcert': 'server-ca.pem',
       'sslcert': 'client-cert.pem',
       'sslkey': 'client-key.pem',
   }
   
   engine = create_engine(cnn, connect_args=ssl_args)

This engine can then be used with pandas for example:

   df.to_sql('my_table', con=engine)

Upvotes: 1

Laurenz Albe
Laurenz Albe

Reputation: 246473

1234.5679 is the special code sent by the client to request SSL-encrypted database connections, and support for that has been in PostgreSQL since commit e0e7daef6da in 1999. But your PostgreSQL cannot be that old, because support for protocol version 3.0 was not added before 2003.

Actually, from studying src/backend/postmaster/postmaster.c and reading the mailing list, this is a bug on the PostgreSQL server:

The client must be configured to try GSS authentication, and when the server rejects, it wants to negotiate an SSL connections, but the server doesn't expect that at this point; hence the error.

See the discussion here. The bug has been fixed with release 12.3.

As a workaround, disable either GSS authentication or SSL negotiation on the client.

In psycopg2, disabling SSL is done by using sslmode="disable" in the connection string, and disabling GSS is done with gssencmode="disable". See the documentation for details.

Upvotes: 24

Julio Batista Silva
Julio Batista Silva

Reputation: 2089

Adding ?gssencmode=disable to the connection string worked for me:

import pyodbc
from sqlalchemy import create_engine

engine = create_engine(f'postgresql://{user}:{password}@localhost:5432/database_name?gssencmode=disable')

Upvotes: 8

atmik
atmik

Reputation: 51

Getting a similar error working with Laravel and Postgres. Solved it by putting this in my .env file: PGGSSENCMODE=disable

Upvotes: 5

Related Questions