使用QSqlDatabase使用“cert”身份验证方法连接到PostgreSQL服务器

时间:2014-11-24 12:14:12

标签: qt postgresql

我需要从我的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");
//.....

1 个答案:

答案 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支持的任何参数都可以。