web-dev-qa-db-ja.com

Psycopg2-PGBouncer-Postgresql>サーバーはSSLをサポートしていませんが、SSLが必要でした

Pgbouncerを介してPostgresqlデータベースに接続するときにSSLを使用するようにDjangoアプリケーションを設定しました。Psycopg2ライブラリを使用しています。

私は以前にこれを成功させたので、同じ手順をもう一度実行しました。

だが!サーバーとクライアントの両方に証明書をインストールしてインストールした後、アプリケーションを実行しようとすると、エラーが発生します。

Django.db.utils.OperationalError:サーバーはSSLをサポートしていませんが、SSLが必要でした

コマンドを入力したとき

psql --set=sslmode=verify-full -h DBHOST -p DBPORT -U USERNAME DBNAME

パスワードを入力してデータベースに正常に接続できます

しかし、私がこのようなコマンドを書くと、

psql "sslmode=verify-full Host=DBHOST dbname=DBNAME port=DBPORT user=USERNAME"

またはpython Shellからコードを入力したとき

import psycopg2
conn = psycopg2.connect(database='DBNAME', user='DBUSER', password='DBPASS', Host='DBHOST', port='DBPORT', sslmode='verify-full')

スタックトレースを取得しました。

/virtual_environment_path/local/lib/python2.7/site-packages/psycopg2/__init__.pyc in connect(dsn, connection_factory, cursor_factory, **kwargs)
    128 
    129     dsn = _ext.make_dsn(dsn, **kwargs)
--> 130     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
    131     if cursor_factory is not None:
    132         conn.cursor_factory = cursor_factory

OperationalError: server does not support SSL, but SSL was required

何が問題なのでしょうか?以前に成功したインストール、パッケージのバージョン、証明書、ファイルのアクセス許可などの間で、インストールされたパッケージを比較しました。しかし、私はこの問題で立ち往生しています。

ご助力ありがとうございます。

1
erdimeola

これは最もばかげた答えかもしれませんが、私のpgbouncerファイルを変更したとき、それは魅力のように機能しました。

client_tls_sslmode = verify-full
client_tls_key_file = /var/lib/postgresql/9.5/main/server.key
client_tls_cert_file = /var/lib/postgresql/9.5/main/server.crt
client_tls_ca_file = /var/lib/postgresql/9.5/main/rootCA.crt

一部は[databases]の直後でしたが、認証設定の部分に移動しました。

1
erdimeola

このコマンドが機能した理由:

psql --set=sslmode=verify-full -h DBHOST -p DBPORT -U USERNAME DBNAME

--setは、psqlプログラム内に「sslmode」という名前のユーザー定義変数を作成するだけですか。その名前はpsqlに特別なものではなく、接続オプションでは何もせず、sslなしで接続するだけです。

2
jjanes