我在 Windows 服务器上安装了 Postgres 10.1,它作为 Windows 服务运行。它安装在%APPDATA%
本地系统用户中,这是运行 Windows 服务的用户帐户:
C:\Windows\System32\config\systemprofile\AppData\Roaming\My App Database
我的服务器端 SSL 证书位于同一目录中,并且我的 postgresql.conf 配置为找到它们:
ssl_cert_file = 'db.crt'
ssl_key_file = 'db.key'
ssl_ca_file = 'ca.crt'
我的 pg_hba.conf 文件似乎配置正确:
hostssl my-database my-username 0.0.0.0/0 cert clientcert=1 map=my-username
我正在尝试使用psql
命令行工具连接:
psql "postgresql://my-username@localhost/my-database?sslmode=verify-full&sslkey=C:\MyDir\MyClientCert.key&sslcert=C:\MyDir\MyClientCert.crt"
但我收到此错误:
psql: root certificate file "C:\Users\Administrator\AppData\Roaming/postgresql/root.crt" does not exist Either provide the file or change sslmode to disable server certificate verification.
我在我的配置中找不到任何引用root.crt
,而且我不知道为什么它会在中查找%APPDATA%\postgresql
,而不是在配置的 PGDATA 目录中查找%APPDATA%\My App Database
。
答案1
连接sslmode=verify-full
意味着您希望客户端验证服务器的证书,这需要使用“sslrootcert”连接参数或“PGSSLROOTCERT”环境变量指定“根证书”。我大胆猜测它默认提供 %APPDATA%\postgres\root.crt。
错误消息提供了您的解决方案,但我怀疑您误解了——这是一个客户端错误而不是服务器错误,服务器配置无关紧要。
提供文件或更改 sslmode 以禁用服务器证书验证。
您可以将 sslmode 更改为“require”或提供根证书。