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
何が問題なのでしょうか?以前に成功したインストール、パッケージのバージョン、証明書、ファイルのアクセス許可などの間で、インストールされたパッケージを比較しました。しかし、私はこの問題で立ち往生しています。
ご助力ありがとうございます。
これは最もばかげた答えかもしれませんが、私の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]の直後でしたが、認証設定の部分に移動しました。
このコマンドが機能した理由:
psql --set=sslmode=verify-full -h DBHOST -p DBPORT -U USERNAME DBNAME
--setは、psql
プログラム内に「sslmode」という名前のユーザー定義変数を作成するだけですか。その名前はpsql
に特別なものではなく、接続オプションでは何もせず、sslなしで接続するだけです。