首页 > 解决方案 > Laravel - 无法从 .env 文件中获取 .pem 公钥数据

问题描述

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

标签: phplaravel

解决方案


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 文件中自然不会出现这种情况。


推荐阅读