我正在尝试使用客户端证书对云 SQL 实例进行身份验证:
psql -h "$IP" "sslmode=verify-ca sslkey=certs/tls.key sslcert=certs/tls.crt sslrootcert=certs/ca.crt dbname=postgres"
Password for user root:
服务器的证书在certs/ca.crt
;客户端的证书/密钥在tls.crt
/ tls.key
。
如您所见,这似乎失败了,并且psql
显然又回到了密码。我该如何调试这种情况,或者命令还有什么问题?
此外,当我在 GCP 中生成证书时,奇怪的是,唯一需要输入的是证书的名称;这是用户?(它似乎最终变成了CN
,这是 vanilla PG 所使用的。)
事实上,下面的互动更加奇怪:
如果我不提供客户端证书,系统会提示我需要这样做:
# psql -h "$IP" "sslmode=verify-ca sslrootcert=certs/ca.crt dbname=postgres"
psql: error: connection to server at "[…]", port 5432 failed: FATAL: connection requires a valid client certificate
(这很有趣,因为我们肯定还有其他东西可以在没有客户端证书的情况下顺利工作?)
如果我随后提供客户端证书,
# psql -h "$IP" "sslmode=verify-ca sslrootcert=certs/ca.crt sslkey=certs/tls.key sslcert=certs/tls.crt dbname=postgres"
Password for user root:
psql: error: connection to server at "[…]", port 5432 failed: fe_sendauth: no password supplied
这是怎么回事?客户端证书足够有效,显然我们不再收到“连接需要有效的客户端证书”错误……但还不够有效,无法进行身份验证?(我们回退到密码,然后最终失败?)
答案1
尽管 PostgreSQL 在使用 SSL 时支持无密码连接,但密码对于 Cloud SQL 来说是强制性的。
在您的示例中,用户是admin
,它由命令行参数指定user=admin
。