首页 > 解决方案 > 如何将 SSL 相关文件的内容发送到 API 调用 | PHP | 卷曲

问题描述

我有两个用于 SSLssl_crtssl_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”。

有人可以帮我解决这个问题吗?

标签: phpjsonfilesslfile-get-contents

解决方案


这里的事后分析是磁盘文件已损坏,磁盘文件已将所有换行符转换为文字斜杠后跟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 文件成为任何一种可复制的


推荐阅读