通过 PHP PDO 通过 SSL 连接到 PGSQL
Connecting to PGSQL over SSL via PHP PDO
我可以在哪里传递我的客户端证书以连接到 PostgreSQL 数据库?我是否必须在 PDO 构造函数的 dsn
或 options
参数中传递这些证书?我无法在线找到任何文档。
我在 Ubuntu 16.04.1 上使用 PHP 7.0.22。我为 pgsql 驱动程序启用了 SSL 支持。我确实在 PDO class 中找到了这些常量:PDO::MYSQL_ATTR_SSL_CA
、PDO::MYSQL_ATTR_SSL_KEY
和其他一些,但这些显然是针对 mySQL 而不是 PGSQL。
编辑
这是一个基于以下答案的有效安全实现:
$dbh = new PDO('pgsql:localhost=host;port=26257;dbname=bank;sslmode=require;sslcert=[path]/client.maxroach.crt;sslkey=[path]/client.maxroach.key;sslrootcert=[path]/ca.crt;',
'maxroach', null, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => true,
));
根据对该字符串的 the PDO Postgres connection string manual, the full DSN string is passed directly to the underlying library function PQconnectdb
. Consequently, you should be able to use all the parameters specified in the PostgreSQL documentation 的评论。
该页面的相关引述:
- sslmode:此选项确定是否或以何种优先级与服务器协商安全 SSL TCP/IP 连接。
- sslcert:该参数指定客户端SSL证书的文件名。
- sslkey:此参数指定用于客户端证书的密钥的位置。
所有三个参数在链接的页面上都有更多详细信息。
请注意,虽然由 PostgreSQL 提供,但此代码全部 运行 与 PHP 在同一台服务器上,因此路径将从该服务器加载,并且需要可读PHP 主机进程。
我可以在哪里传递我的客户端证书以连接到 PostgreSQL 数据库?我是否必须在 PDO 构造函数的 dsn
或 options
参数中传递这些证书?我无法在线找到任何文档。
我在 Ubuntu 16.04.1 上使用 PHP 7.0.22。我为 pgsql 驱动程序启用了 SSL 支持。我确实在 PDO class 中找到了这些常量:PDO::MYSQL_ATTR_SSL_CA
、PDO::MYSQL_ATTR_SSL_KEY
和其他一些,但这些显然是针对 mySQL 而不是 PGSQL。
编辑
这是一个基于以下答案的有效安全实现:
$dbh = new PDO('pgsql:localhost=host;port=26257;dbname=bank;sslmode=require;sslcert=[path]/client.maxroach.crt;sslkey=[path]/client.maxroach.key;sslrootcert=[path]/ca.crt;',
'maxroach', null, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => true,
));
根据对该字符串的 the PDO Postgres connection string manual, the full DSN string is passed directly to the underlying library function PQconnectdb
. Consequently, you should be able to use all the parameters specified in the PostgreSQL documentation 的评论。
该页面的相关引述:
- sslmode:此选项确定是否或以何种优先级与服务器协商安全 SSL TCP/IP 连接。
- sslcert:该参数指定客户端SSL证书的文件名。
- sslkey:此参数指定用于客户端证书的密钥的位置。
所有三个参数在链接的页面上都有更多详细信息。
请注意,虽然由 PostgreSQL 提供,但此代码全部 运行 与 PHP 在同一台服务器上,因此路径将从该服务器加载,并且需要可读PHP 主机进程。