我需要从我的Qt应用程序与PostgreSQL数据库进行通信,但服务器使用" cert"身份验证方法,所以我需要将证书传递给服务器。
我现在看到的唯一解决方案是获取PGconn*
这样的内容:
QSqlDatabase db;
//.....
PGconn* conn = (PGconn*)db.driver()->handle()->data();
并做一些工作。甚至拒绝QSqlDatabase并直接使用libpq
。
如果不使用代码中的libpq
,还有其他方法吗?例如,像这样:
//hypothetic QSqlDatabase methods:
QSqlDatabase db;
//.....
db.SetSslCert("/path/to/my/cert.crt");
db.SetSslKey("/path/to/my/cert.key");
//.....
答案 0 :(得分:2)
我需要将证书传递给服务器。
Qt中没有任何功能,因为在libpq中也没有相同的功能。它会自动发生,如libpq文档中SSL support内的客户端证书中所述
摘录:
如果服务器请求可信客户端证书,libpq将发送 证书存储在文件〜/ .postgresql / postgresql.crt中 用户的主目录。证书必须由其中一个签署 证书颁发机构(CA)受服务器信任。一个匹配的私人 密钥文件〜/ .postgresql / postgresql.key也必须存在
(在Windows中,~/.postgresql
将是%APPDATA%\postgresql
)
Qt应用程序也会发生同样的情况,因为Qt的QPSQL驱动程序是建立在libpq之上的。即使对于驱动程序本身,连接使用SSL和证书的事实也基本上是透明的。
编辑:如果~/.posgresql
不方便,就像它们是多个证书一样,则存在替代方案:
证书和密钥文件的位置可以被覆盖 连接参数sslcert和sslkey或环境变量 PGSSLCERT和PGSSLKEY
连接参数通过QSqlDatabase::setConnectOptions
设置。尽管它的文档只提到了少数特定于postgresql的参数,但实际上它会接受任何参数,因此libpq
支持的任何参数都可以。