【问题标题】:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104
【发布时间】:2022-05-17 09:09:54
【问题描述】:

我通过 curl 在基于 ssl 手段 (https) 的 api 上提交订单数据,但它返回 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 消息。

这是我根据客户要求的 json 的测试代码:

$apiKey = "xxxxxx-xxxxxx-xxxxx-xxxxxx-xxxxxx";
$privatekey = "xxxxxx-xxxxxx-xxxxx-xxxxxx-xxxxxx";
$timestamp = date('Y-m-d H:i:s'); // (for example: 2016-07-19 14:05:55)

$signature = hash_hmac('sha1', $timestamp, $apiKey);
$signature = hash_hmac('sha1', $privatekey, $signature);

$postURL = "https://www.compu-cover.com/intelligent-rewards/orders/?OrderNo=123";

$orderInfo['Order'] = array(
        "apiKey" => $apiKey,
        "privatekey" => $privatekey,
        "Signature" => $signature,
        "Timestamp" => $timestamp,
        "Firstname" => "Ajay",
        "Surname" => "Sharma",
        "EmailAddress" => "ajay@yopmail.com",
        "DaytimeTel" => "0141798526",
        "EveningTel" => "0141798526",
        "MobileTel" => "9887654321",
        "Address1" => "A-5",
        "Address2" => "Jhalana",
        "Address3" => "Jaipur",
        "Address4" => "Rajasthan",
        "County" => "India",
        "Postcode" => "302019", 
        "Cover" => "ADTBL",
        "Scheme" => 2, 
        "Premium" => 5,
        "EquipmentQty" => 1,
        "EquipmentType1" => "Smartphone",
        "EquipmentMake1" => "Moto",
        "EquipmentModel1" => "Moto G",
        "EquipmentPrice1" => 100
    );

$params = json_encode($orderInfo);

$session = curl_init($postURL);

curl_setopt($session, CURLOPT_POST, true);
curl_setopt($session, CURLOPT_POSTFIELDS, $params);
curl_setopt($session, CURLOPT_HEADER, true);
curl_setopt($session, CURLOPT_SSL_VERIFYPEER, true); 

$response = curl_exec($session);

if (FALSE === $response) {
    var_dump(curl_error($session));
    var_dump(curl_errno($session));
}

curl_close($session);
$response = json_decode($response);

var_dump($response);

如何找出失败的原因?失败的原因可能是什么?请提供您的建议。

【问题讨论】:

  • 你是在 docker 中运行这个吗?
  • 找到解决方案了吗?
  • 不确定这是否与您的问题有关,但似乎您缺少 CURLOPT_RETURNTRANSFER。
  • 您能解决问题吗?

标签: php curl


【解决方案1】:

您可能有很多原因可能会得到这个。

对我来说,我得到这个是因为我正在使用 curl,而我访问的网站不喜欢使用 curl。我用以下方法解决了这个问题:

curl -A "Mozilla Chrome Safari" someserver.com/somepage.html

这告诉 curl 对服务器说,“嘿,我是浏览器”。您可以使用您最喜欢的浏览器来获取更好的更新字符串,通常在“网络”下访问浏览器开发人员控制台,您可以看到各个请求项,在那里您可以获得当前浏览器作为“用户代理”发送的字符串。

网站这样做的原因是您的典型客户不使用 curl。最好的情况是 curl 将是一个耗尽服务器资源的机器人,最坏的情况是一个邪恶的黑客。

【讨论】:

    【解决方案2】:

    我有同样的问题。

    OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104
    

    我猜这个错误被认为是openssl或等等。 但是,事实并非如此。

    就我而言,POST 参数之一是错误值。 (类似于 OTP 代码) 我终于解决了。

    【讨论】:

      【解决方案3】:

      我收到了此错误,只需等待半小时再试一次即可解决。

      【讨论】:

      • 是的,在我能够curl 之前一直没有任何问题,但今天得到了这个错误,而代码根本没有改变。感觉像是网络问题,可能会不时发生,但我不确定。
      【解决方案4】:

      我还意识到缺少发布数据信息。这样做之后,一切都按预期工作

      【讨论】:

        【解决方案5】:

        我在将数据发布到域时也遇到了错误

        OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104

        我得到了一个解决方案,正如 LazyBrush 所提到的,您可以按照以下方式在 curl 中设置用户代理:

        $data_string_ary = array(SOME ARRAY INDEXES);
        $data_string = json_encode($data_string_ary);
        $url = 'someserver.com/somepage.html';
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla Chrome Safari');
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Authorization: YOUR AUTHORIZATION CODE'
        ));
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
        

        它对我来说就像一个魅力。希望这对你也有帮助。

        【讨论】:

          【解决方案6】:

          在标准 C 库中,变量 errno 包含最近一次系统调用出错的代码。 104 的值定义为ECONNRESET,意思是“连接被对端重置”。

          这个错误只是意味着对方挂断了你,没有完成正常的 HTTPS 协议并返回任何东西作为回报......可能出于各种原因,可能是网络问题,或者服务器端程序崩溃,或者另一端根本不喜欢你所做的。它与 OpenSSL 完全没有关系,要知道是什么原因导致的,您需要访问服务器日志。

          【讨论】:

            【解决方案7】:

            大多数情况下,如果您没有正确的 Internet 连接,就会发生这种情况。再试一次,它对我有用

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 2020-03-07
            • 2020-07-29
            • 1970-01-01
            • 2021-08-27
            • 2015-05-26
            • 2021-11-17
            • 1970-01-01
            • 2019-03-26
            • 1970-01-01
            相关资源
            最近更新 更多