【问题标题】:Laravel - Can't get .pem public key data from .env fileLaravel - 无法从 .env 文件中获取 .pem 公钥数据
【发布时间】:2018-11-21 15:34:13
【问题描述】:

我有一个使用 Laravel 构建的 webapp,我需要使用 .pem 文件中的公钥来验证一些数据。密钥保存在 .env 文件中,并通过 config/app.phpenv() 帮助程序检索。由于 .pem 密钥需要位于具有特定长度的单独行上,因此我使用 \n 字符将密钥保持在一行上。问题是当我使用 \n 字符时,变量没有被缓存,我无法访问它。当我删除 \n 字符时,我可以检索变量,但 openssl_get_privatekey($key); 返回 false。我究竟做错了什么?这是 Laravel 还是一些一般的 PHP 问题?

【问题讨论】:

  • 将pem放入实际文件并存储在服务器上;将文件路径放在 .env 中。

标签: php laravel


【解决方案1】:

PHP 的 dotenv 包似乎不支持多行环境变量。

理想情况下,您应该将 .pem 文件保存为文件并通过路径引用它,例如:

PEM_FILE=/path/to/file.pem

在配置中:

return [
    //...
    "key" => file_get_contents(env('PEM_FILE'))

这是有道理的,因为通常证书通常应该放在服务器上的专用证书路径中。如果您缓存配置,那么 .pem 文件的实际内容只会在部署时读取一次。

但是,如果你必须把它放在 dotenv 中,那么你可以这样做:

在.env中

PEM_KEY="-----BEGIN RSA PRIVATE KEY-----\n…\n-----END DSA PRIVATE KEY-----"

在配置中:

return [
    //...
    "key" => str_replace("\\n", "\n", env('PEM_KEY')), 

由于密钥通常是 base64,我认为 \n 不可能自然地出现在 .pem 文件中。

【讨论】:

  • 首先,感谢您非常彻底的回答。我的问题应该更准确一点。您回答的第二部分是我目前正在尝试做的事情,但它不起作用。在我添加\n 之后,它立即停止工作。但我会尝试第一部分,看看是否有效。
  • 我尝试了第一部分,直到我真正需要使用它,openssl_get_privatekey($key) 仍然返回 false。
  • 根据the manual,您可以尝试设置PEM_FILE="file://path/to/file.pem" 并让openssl 通过openssl_get_privatekey(env('PEM_FILE')) 直接从文件中读取它。如果这不起作用,那么实际的密钥文件可能有问题
  • 还是不行。如果你不介意,你可以自己检查一下。密钥可在此处访问并且是公开的:klient.liisi.ee/static/payment_link_doc/_downloads/…
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多