使用psql以ssl模式连接到postgresql

Lol*_*lly 60 postgresql ssl ssl-certificate postgresql-8.4

我正在尝试为postgreSQL服务器配置ssl证书.我在数据目录中创建了证书文件(server.crt)和密钥(server.key),并将参数SSL更新为"on"以启用安全连接.

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

我正在使用PostgreSQL 8.4和Linux.我尝试使用以下命令连接到启用了ssl的服务器

       psql "postgresql://localhost:2345/postgres?sslmode=require"
Run Code Online (Sandbox Code Playgroud)

但我得到了

       psql: invalid connection option "postgresql://localhost:2345/postgres?sslmode"
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?我尝试连接到服务器的方式是否启用了ssl模式是正确的?是否可以仅验证服务器而不是客户端?

请帮帮我.

Dan*_*ité 95

psql 9.2以下版本不接受这种类似URL的语法.

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

conninfo字符串示例(针对psql 8.4更新)

psql "sslmode=require host=localhost dbname=test"
Run Code Online (Sandbox Code Playgroud)

阅读手册页以获取更多选项.

  • 我也试过你的选项 `psql -h localhost -p 2345 -U thirunas -d postgres "sslmode=require" -f test_schema.ddl` 但它说 `sql: 警告:额外的命令行参数 "sslmode=require" 被忽略` (3认同)
  • @布鲁诺:我犯了错误。刚刚注意到文档中的版本差异。但在第一个参数中仍然有它,我得到了同样的警告。`psql -h localhost "sslmode=require" -p 2345 -U thirunas -d postgres -f test_schema.ddl`。警告`psql:警告:忽略额外的命令行参数“sslmode=require”` (2认同)
  • @Wave和其他遇到此问题的人使用conninfo字符串而不是数据库名称(-d).您可以在-d选项后指定数据库名称,也可以在命令行上指定第一个非选项参数.所以-d postgres"sslmode = require"应该是psql [options] -d"dbname = postgres sslmode = require"[其他选项]或psql [options]"dbname = postgres sslmode = require".您可以将许多其他选项移动到conninfo字符串中. (2认同)

Sab*_*rov 16

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

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" 
Run Code Online (Sandbox Code Playgroud)


小智 15

psql --set=sslmode=require -h localhost -p 2345 -U thirunas \
-d postgres -f test_schema.ddl
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的。`--set=sslmode=require` 定义了一个完全不参与身份验证过程的 psql 变量。它**不执行任何操作**来强制使用 SSL。 (7认同)
  • 我可以确认这不起作用,正如@DanielVérité 所指出的那样。使用具有不受信任的证书的 postgres 服务器进行测试并使用 `--set=sslmode=verify-full` 不会抱怨。 (4认同)

小智 8

发现以下选项可用于为自签名 postgres 实例提供所有文件

psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} dbname={db}"
Run Code Online (Sandbox Code Playgroud)


Fre*_*edG 6

在 psql 客户端 v12 上,我在 psql 客户端中找不到激活sslmode=verify-full.

我最终使用了环境变量:

PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db
Run Code Online (Sandbox Code Playgroud)