php curl 获取https请求的2种方法

  • Post category:http

下面是详细讲解”phpcurl获取https请求的2种方法”的攻略:

什么是curl

cURL(Client URL)是一个用于命令行下工作的,可以使用URL语法来传输文件和数据的工具,被广泛应用于传输文件下载、API调用等场景。PHP有自己的CURL库,我们可以通过它来进行一些网络请求操作。

什么是https

HTTPS (Hypertext Transfer Protocol Secure) 本质上是在传输层(TLS/SSL)提供了可靠的端到端加密功能,确保数据传输过程中安全性和完整性。

当数据进行网络传输时,https会为数据加上HTTP和安全套接字层(SSL)或传输层安全协议(TLS)协议,即HTTPS,来确保数据传输的安全。其中,SSL协议是HTTPS中最为核心的安全技术之一,主要功能在于为浏览器和服务器之间的网络连接加密。

curl获取https请求

当我们使用https协议进行请求时,需要注意以下几点:

  1. 需要开启curl扩展中的openssl支持
  2. 需要将请求的url中的http://替换成https://

此外,我们获取https请求主要需要访问服务器证书,有两种方式可以实现。

方式一:关闭SSL验证

由于cURL在请求https时,默认会验证对方的证书,当请求不被信任时,会抛出”SSL certificate problem: unable to get local issuer certificate”这样的错误。此时,我们可以通过关闭证书验证取消检验来解决该问题。

$url = "https://www.example.com/";

$ch = curl_init();

//关闭SSL验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);

if (curl_errno($ch)) {
    echo "Error: " . curl_error($ch);
}

curl_close($ch);

echo $result;

从代码中可以看出,我们首先设置了请求的url、采用的请求选项,同时关闭了SSL证书验证,当请求返回数据时,直接输出即可。值得注意的是,关闭ssl证书验证无异于废掉了https的一项屏障,因此此时我们需要自主考虑请求的安全问题。

方式二:设置证书文件

我们可以通过cURL提供的参数CURLOPT_CAINFO来指定需要验证的证书列表,也就是说,将SSL证书转换为root-ca.pem格式,然后指定该文件作为HTTPS请求所能够信任的证书列表即可。

在此基础上,我们可以采用下方的代码来获取https请求。

$url = "https://www.example.com/";

$ch = curl_init();

// 设置证书文件
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/root-ca.pem');

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);

if (curl_errno($ch)) {
    echo "Error: " . curl_error($ch);
}

curl_close($ch);

echo $result;

在上面的代码中,我们首先指定了证书文件路径,同时采用了curl_setopt函数设置了HTTPS的安全选项。值得注意的是,此处我们需要自己手动指定root-ca.pem文件,并将其设置为执行文件所在的根目录下。

示例说明

  • 示例1

假设我们需要将一个绝对路径的文件上传到指定的https地址:https://www.example.com/upload.php,我们可以采用如下方式:

$url = "https://www.example.com/upload.php";

$file_path = '/data/test.text';

$ch = curl_init();

$file = new CURLFile($file_path);

$data = array('file' => $file);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// 通过证书文件验证https连接 
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/root-ca.pem');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

$output = curl_exec($ch);
if (curl_errno($ch)) {
    echo "Error: " . curl_error($ch);
}
curl_close($ch);
echo $output;

上面的代码中,我们向一个https地址http://www.example.com/upload.php提交了一个文件。其中,需要注意的是,我们在设置请求方式时采用了curl_setopt($ch, CURLOPT_POST, 1),而非上方方式中的curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1),这是因为我们需要采用POST方式进行上传文件。

此外,为了验证https连接,我们也在代码中加入了curl_setopt函数进行设置。

  • 示例2

假设我们需要向目标服务器发送一个GET请求,并获取返回数据,我们可以采用以下代码:

$url = "https://www.example.com/getdata.php?key1=value1&key2=value2";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 通过证书文件验证https连接 
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/root-ca.pem');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

$output = curl_exec($ch);
if (curl_errno($ch)) {
    echo "Error: " . curl_error($ch);
}
curl_close($ch);
echo $output;

从上面的代码中可以看出,我们通过设置请求的url,并通过curl_setopt函数定义请求的方式,最后获取到请求返回的数据。

需要注意的是,在此处,我们同样需要定义curl_setopt函数来验证https连接。