php - 如何将 SSL 相关文件的内容发送到 API 调用 | PHP | 卷曲
问题描述
我有两个用于 SSLssl_crt
和ssl_key
. 我想读取这些文件的内容并将其作为 JSON 字段发送到 API。但file_get_contents
实际上将单斜杠转换为双斜杠,因此 API 返回以下错误。
私钥格式无效。
证书格式无效。
我实际上正在使用运行云服务,我想将这些文件的内容发送到他们的 API 之一
https://runcloud.io/docs/api/web-application#ssl-basic-install-ssl
正如您在上面的 URL 中看到的,他们需要格式正确的内容。
所以我尝试了以下方法。
$curl = curl_init();
$ssl_crt = file_get_contents(selectServer()->ssl_crt_path);
$ssl_key = file_get_contents(selectServer()->ssl_key_path);
$data = [
'provider' => 'custom',
'enableHttp' => true,
'enableHsts' => false,
'certificate' => $ssl_crt,
'privateKey' => $ssl_key,
];
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://manage.runcloud.io/api/v2/servers/{id}/webapps/{webapp_id}/ssl',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_SLASHES),
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'Content-Type: application/json',
'Authorization: Basic {token}'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
如果我手动将证书(或密钥)的内容写入数据数组,那么它可以正常工作。IE
$data = [
// ...
'certificate' => '-----BEGIN CERTIFICATE-----\nblah\nblah==\n-----END CERTIFICATE-----,
'privateKey' => '-----BEGIN PRIVATE KEY-----\nblah\nblah==\n-----END PRIVATE KEY-----,
];
格式的实际问题。“\n”变为“\n”,证书或密钥的主要内容可以有“\n”。
有人可以帮我解决这个问题吗?
解决方案
这里的事后分析是磁盘文件已损坏,磁盘文件已将所有换行符转换为文字斜杠后跟n,PHP的双引号运算符正在修复它,因此当您硬编码时它可以工作该文件(使用 php 的双引号运算符。它不适用于 php 的单引号运算符),并且当您从 file_get_contents() 获取它时不起作用 - 用于修复磁盘文件的代码是
<?php
$real_crt=file_get_contents("ssl_crt");
$fixed_crt = strtr($real_crt,array(
"\\n"=>"\n",
"\\r"=>"\r",
));
file_put_contents("ssl_crt_fixed",$fixed_crt);
不过,我只是在你在 facebook messenger 上向我发送了 ssl_cert 文件后才知道这一点,而且我很确定需要 ssl_cert 文件来解决这个谜团,所以我投票决定关闭这个问题,requires the shortest code necessary to reproduce the problem.
即它需要 ssl_cert 文件成为任何一种可复制的
推荐阅读
- node.js - 条带 webhook 的 firebase 功能不适用于 async-await
- c# - 错误 CS0234 命名空间“Microsoft”中不存在类型或命名空间名称“Reporting”(您是否缺少程序集引用?)
- html - 单击按钮时更改边框颜色 vuetify v-card
- swift - 在 Swift (SwiftUI) 中的堆栈上设置自定义背景颜色
- c++ - 如何在一行中从 int 引用中获取指向 const int 的指针?
- postgresql - 如何根据特定条件在 PostgreSQL 中执行“SUM()”?用于汇总会计日记帐表中的借方和贷方
- python - 如何按特定行数进行分组或重新采样——使用 Dask (Python)
- node.js - 如何在 node.js 中订购数据库调用?
- python - UFuncTypeError:ufunc 'matmul' 不包含具有签名匹配类型的循环(dtype('
dtype(' #Linear Regression Model @st.cache(allow_output_mutation=True) def linearRegression(X_train, X_test, y_tr
- javascript - 是否可以通过广播通道 API 将 SharedArrayBuffer 广播给 Web Worker?