连接需要具有 ssl 模式的 laravel google cloud postgres 中的有效客户端证书

Posted

技术标签:

【中文标题】连接需要具有 ssl 模式的 laravel google cloud postgres 中的有效客户端证书【英文标题】:connection requires a valid client certificate in laravel google cloud postgres with ssl mode 【发布时间】:2022-01-22 05:34:29 【问题描述】:

我在尝试连接到 gcloud postgres db 时遇到问题,允许在我的 laravel 应用程序中运行 ssl,该应用程序在云中运行。我从 gcloud 下载了所有三个证书文件,并在 config/database.php 中设置了路径。

'pgsql' => [
            'driver' => 'pgsql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'require',
            'options' => [
               'sslcert' => storage_path(path: 'client-cert.pem'),
               'sslkey' => storage_path(path: 'client-key.pem'),
               'sslrootcert' => storage_path(path: 'server-ca.pem'),
            ],
        ],

启用“仅允许 SSL 连接”后,我收到此错误:

'SQLSTATE[08006] [7] FATAL: connection requires a valid client certificate (SQL: select * from "sessions" where "id" = wDJOd7Ssm6ggLngYQPprlIP0FNrtMxGTtCW4lELX limit 1)'

我可以通过 pgadmin 和 psql 控制台使用本地机器(Windows)的 SSL 证书成功连接到同一个数据库。但我需要通过我的应用程序来完成。请帮助我克服这个问题,因为它在 GCP 安全指挥中心显示为一个高安全风险因素。 谢谢。

【问题讨论】:

【参考方案1】:

至少有两个可能的问题:

第 1 项:

你有 'sslmode' => 'require'。这意味着服务器证书已根据 CA 进行验证。对于 Google Cloud SQL,服务器证书包含与主机名不匹配的 Cloud SQL 实例名称。

将值更改为允许。 Google Cloud SQL 将强制执行客户端证书。 PostgresQL 客户端不会验证服务器的证书,如果验证将失败。

第 2 项:

证书无效。在文本编辑器中打开每个文件并验证它们是否是具有正确标题的文本文件:

client_cert.pem:-----BEGIN CERTIFICATE----- client_key.pem: -----BEGIN RSA PRIVATE KEY----- server-ca.pem: -----BEGIN CERTIFICATE-----

您也可以使用 openssl 来验证文件。

【讨论】:

我检查了它们的标题,一切正常。当我将 ssl 模式更改为 'sslmode' => 'allow' 时,我收到不同的错误 'connection to server at 10.112.***.*, port 5432 failed: FATAL: pg_hba.conf rejects connection for host "10.156. *.*”,用户“”,数据库“****”,SSL 断开与服务器的“10.112..* 连接,端口 5432 失败:SSL 错误:证书验证失败' @user3683222 - Laravel 的哪个版本? 是 laravel 8. 最后我能够通过使用云身份验证代理来解决这个问题。通过 docker 安装了 cluoud 代理,并在 supervisor conf 中运行 '/var/www/html/cloud_sql_proxy -instances=your connection instance:datbase connection=tcp:127.0.0.1:5432'。

以上是关于连接需要具有 ssl 模式的 laravel google cloud postgres 中的有效客户端证书的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 连接具有中间关系的表

Laravel Websockets - 错误:失败:连接建立错误:net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH

具有多个左连接和计数的错误计算(Laravel)

Laravel 5.1 GCM 推送通知 SSL 错误

SSL:GAE/Go 上的 CERTIFICATE_VERIFY_FAILED

终止大量 SSL 连接具有成本效益