cURL API调用返回404(如果关闭了SSL验证),但是JS API调用正常工作

时间:2018-12-18 17:29:18

标签: php ssl curl postman

我正在尝试设置一个表单,该表单一旦提交,将通过API调用发送数据以保存到第三方门户。门户设置为主站点的子域,但托管在另一台服务器上。

在Postman中测试API调用时,仅当我通过代理连接时它们才有效,并且在选项中禁用了SSL证书验证。在网站上,我收到一个cURL错误:“ SSL证书问题:无法获取本地发行者证书”。管理主站点的服务器管理员试图按照此处https://curl.haxx.se/docs/sslcerts.html的详细信息解决此购买问题,但目前尚无法找到解决方案。

当他们找出证书问题时,我希望至少可以使用API​​调用,并且由于仍必须由客户人员手动审核任何提交,因此我认为一种快速的解决方法是禁用SSL验证在cURL调用中(显然不理想),作为客户端的临时解决方案。

我正在使用的cURL调用如下:

$url = "https://subdomain.primarydomain.com:444/api/v2/login?username=username&password=12345";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");


$result = curl_exec($ch);
if ($result === false) {
    echo 'Curl error: ' . curl_error($ch);
} else {
    echo 'Operation completed without any errors';
}
curl_close($ch);    

当执行cURL命令时,这将返回404 not found响应。如果代码是在主域服务器上运行的,或者即使通过VPN连接,即使在本地运行(WAMP),也会出现此结果。

但是,以下JS代码可以正常运行并返回预期结果:

async function getTkn()
{
    var tkn = "";

    try {
        var postResult = await $.post("https://subdomain.primarydomain.com:444/api/v2/login", {username: "username", password: "12345"}, function(data){
            console.log("success in post");
            console.log(data);
            tkn = data.token;
            })
            .done(function(data) {
                console.log("post is done");
                console.log(data);

                if(data.token != "")
                {
                    console.log("log in successful");
                    console.log("token-success: " + data.token);
                    // Save Registration Data
                //  await saveClientRegistration(tkn, fieldValues);
                }
                else
                {
                    console.log("log in fail");
                    console.log("token-fail: " + data);
                }
            })
            .fail(function(data) {
                console.log("authentication failed");
            })
            .always(function(data) {
                console.log("always finished");
            }).then();

    } catch(e) {
        console.log(e);
    }   

    return tkn;
}

由于我们需要以纯文本格式发送用户名/密码,因此我不想将这些用户名/密码存储在易于访问的JS文件中,因此我想使PHP cURL正常工作。

由于我在过去6个小时中一直在尝试与Google不同的方法,因此,有关如何解决cURL问题的任何建议将不胜感激。

更新:我尝试如下使用cURL中的代理选项,但没有成功。我收到错误消息:“接收失败:对等连接重置”

$proxy = 'maindomain_IP:444';
$proxyauth = 'proxy_user:proxy_pass';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
//curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); 
curl_setopt($ch, CURLOPT_PORT, 444);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT , 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//curl_setopt ($ch, CURLOPT_VERBOSE, TRUE);
if (curl_exec($ch) === false) {
    echo 'Curl error: ' . curl_error($ch);
} else {
    echo 'Operation completed without any errors';
}
$content = curl_exec($ch);
curl_close($ch);

0 个答案:

没有答案