在 SSL 模式下使用 psql 连接到 PostgreSQL

我正在尝试为 PostgreSQL 服务器配置 ssl 证书。我已经在 data 目录中创建了一个证书文件(server.crt)和 key (server.key) ,并将参数 SSL 更新为“ on”以启用安全连接。

我只希望服务器在客户端使用服务器证书进行身份验证,而不要求服务器端具有客户端的真实性。我使用 psql 作为客户端来连接和执行命令。

我正在使用 PostgreSQL 8.4和 Linux

       psql "postgresql://localhost:2345/postgres?sslmode=require"

但我现在

       psql: invalid connection option "postgresql://localhost:2345/postgres?sslmode"

我做错了什么?我尝试连接到启用 SSL 模式的服务器的方式是否正确?只对服务器进行身份验证而不对客户端进行身份验证是否可行?

267727 次浏览

低于9.2的 psql不接受这种类似 URL 的选项语法。

SSL 的使用可以通过命令行上的 sslmode=value选项或者 PGSSLMODE环境变量来驱动,但是默认情况下是 prefer,SSL 连接将首先自动尝试,而不需要指定任何内容。

使用 conninfo 字符串(更新为 psql 8.4)的示例

psql "sslmode=require host=localhost dbname=test"

阅读 手册了解更多选项。

psql "sslmode=require host=localhost port=2345 dbname=postgres" --username=some_user

According to the Postgres psql 文档, only the connection parameters should go in the conninfo string(that's why in our example, --username is not inside that string)

psql --set=sslmode=require -h localhost -p 2345 -U thirunas \
-d postgres -f test_schema.ddl

安全连接到 Azure 的托管 Postgres 数据库的另一个例子:

psql --file=product_data.sql --host=hostname.postgres.database.azure.com --port=5432 \
--username=postgres@postgres-esprit --dbname=product_data \
--set=sslmode=verify-full --set=sslrootcert=/opt/ssl/BaltimoreCyberTrustRoot.crt.pem
psql -h <host> -p <port> -U <user> -d <db>

更新 /var/lib/pgsql/10/data/pg_hba.conf,将 auth 方法更改为 cert:

Https://www.postgresql.org/docs/9.1/auth-pg-hba-conf.html

发现以下选项对于提供自签名 postgres 实例的所有文件非常有用

psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} dbname={db}"

如果连接在 SSL 模式下需要,那么您可以使用以下命令提供所有信息:

psql "sslmode=verify-ca sslrootcert=server-ca.pem sslcert=client-cert.pem sslkey=client-key.pem hostaddr=your_host port=5432 user=your_user dbname=your_db"

在 psql 客户机 v12上,我无法在 psql 客户机中找到激活 sslmode=verify-full的选项。

我最终使用了环境变量:

PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db

Another pattern that worked with v8 is

Psql-h host _ name-p port-U user _ name“ dbname = db sslmode = demand”