我们有一个Windows桌面服务于Apache 2 PHP网站,目前从本地postgresql示例访问数据。我们正在将数据库迁移到Google SQL Postgres示例,并使用SSL加密的公共IP地址。
我已经在Google Cloud上创建了必要的证书。数据库已经启动并运行,我已经成功地让所有Windows应用程序(.Net和.Net Core)连接到Cloud SQL数据库示例。
到目前为止,我在让PHP连接到同一个数据库方面完全受阻。我尝试了连接字符串和参数的许多组合,但无法使任何东西工作。
示例pg_connect字符串(已清理):
host={secret information} port=5432 dbname={secret information} user={secret information} password={secret information} sslmode=require sslcert=client-cert.pem sslkey=client-key.pem
client-cert.pem和client-key.pem是从Google生成/下载的,在Windows应用程序上运行良好。这些文件与我的html/php源代码一起保存在c:\apache24\htdocs中。我还存储了server-ca.pem,并尝试引用它。
我创建了(从另一个用户那里复制的-为什么要重新发明轮子)一个样本页面来测试,但没有得到任何结果。测试页面:
<?php
// Create a custom exception error handler for pg_connect
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
// Set the error handler
set_error_handler("exception_error_handler");
// Force output of all errors
error_reporting(E_ALL);
// Define constants
define('DB_HOST', '{secret information}');
define('DB_USER', '{secret information}');
define('DB_PASS', '{secret information}');
define('DB_NAME', '{secret information}');
define('DB_PORT', '5432');
// Connection string with SSL certificate files
$conn_str = 'host=' . DB_HOST . ' ';
$conn_str .= 'port=' . DB_PORT . ' ';
$conn_str .= 'dbname=' . DB_NAME . ' ';
$conn_str .= 'user=' . DB_USER . ' ';
$conn_str .= 'password=' . DB_PASS . ' ';
$conn_str .= 'sslmode=require ';
$conn_str .= 'sslcert=client-cert.pem ';
$conn_str .= 'sslkey=client-key.pem ';
// Try catch block grabbing stored exception
try {
echo "Attempting pg_connect: " . $conn_str . "<br>";
$conn=@pg_connect($conn_str);
} catch (Exception $e) {
echo $e->getMessage();
}
// Attempt Connection
$conn = pg_connect($conn_str) or die('Cannot connect to database.');
// Set SQL String
$sql = 'SELECT * FROM client';
// Attempt query and iterate results
if (result = pg_query($conn, $sql))
{
while($row=pg_fetch_row($result))
{
var_dump($row);
}
}
// Close it up
pg_close();
?>
我使用测试时遇到的错误:
Attempting pg_connect: host={secret information} port=5432 dbname={secret information} user={secret information} password={secret information} sslmode=require sslcert=client-cert.pem sslkey=client-key.pem
pg_connect(): Unable to connect to PostgreSQL server: FATAL: connection requires a valid client certificate
Fatal error: Uncaught ErrorException: pg_connect(): Unable to connect to PostgreSQL server: FATAL: connection requires a valid client certificate in C:\apache24\htdocs\test.php:38 Stack trace: #0 [internal function]: exception_error_handler(2, 'pg_connect(): U...', 'C:\\apache24\\htd...', 38, Array) #1 C:\apache24\htdocs\test.php(38): pg_connect('host={secret information}...') #2 {main} thrown in C:\apache24\htdocs\test.php on line 38
根据我在其他地方找到的提示,我尝试将完整路径添加到证书和密钥。已尝试包含server-ca.pem和sslpassword参数。
如果你能给我一些新的想法我会感激不尽的...
1条答案
按热度按时间hgqdbh6s1#
我的问题是如何键入证书和密钥的完整路径。Windows和'nix路径之间的差异。
将路径前缀设置为:
一切正常
该死的
/ \
问题。