php - 如何使用 php curl 进行双向/双向身份验证?
问题描述
该网站说“您没有使用数字证书进行身份验证,或者连接时间已过期。使用您的数字证书再次进行身份验证。”。
我每次都收到这条消息,所以不是连接时间到期,我认为我的身份验证尝试是行不通的。
我这样做的方式是从一个 pfx 文件和一个打开它的密码开始。我使用 openssl 和 pfx 制作 pem 证书。
代码:
<?php
$pfx_path = 'me.pfx';
$pfx_pass = 'foopass123';
$pfx_values = [];
openssl_pkcs12_read(file_get_contents($pfx_path), $pfx_values, $pfx_pass);
$cert_path = 'me.pem';
file_put_contents($cert_path, $pfx_values['cert'] . "\n" . $pfx_values['pkey']);
$postfields = 'field1=val1&field2=val2&field3=val3';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL , 'https://www.example.com');
curl_setopt($ch, CURLOPT_POST , true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS , $postfields);
curl_setopt($ch, CURLOPT_SSLCERT , $cert_path);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
$curl_result = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
执行代码的结果(仅显示 $curl_result 的 HTML 的引用):
您没有使用数字证书进行身份验证,或者可能连接时间已过期。再次使用数字证书进行身份验证。
顺便说一句,$curl_info['ssl_verify_result']
是 0,我猜这意味着至少服务器经过了正确的身份验证。
编辑:删除CURLOPT_SSLCERTPASSWD
是因为没有必要,pfx 文件已经用密码打开了,并且它的私钥和公钥被赤裸裸地放入$cert_path
.
解决方案
标头是在该特定站点上成功进行身份验证所必需的。缺少的标头是Cookie: ...
,其中包含特定字段,例如会话 ID(您可以通过使用 cURL 登录网站或简单地作为用户通过浏览器获取,您可以复制并粘贴服务器生成的 cookie)。
您可以使用以下命令指定 Cookie 标头:
curl_setopt($ch, CURLOPT_COOKIE,
'foo=123;'
. ' bar=456;'
. ' SESSIONID=789;'
);
或者,您可以使用以下方式指定它:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Cookie: foo=123;'
. ' bar=456;'
. ' SESSIONID=789;'
));
以一般的方式看待这个问题,而不是作为仅限于特定站点的问题,请注意不同的站点将需要不同的标头和 cookie,也可能不需要。
因此,如果您想像用户一样在给定站点中进行相互身份验证,请确保您使用正确的标头和 cookie,以备不时之需。
现在,如何使用 cURL 获取会话 ID,这取决于每个站点,这超出了问题的范围,但总的来说,它是用 PHP 模仿用户在浏览器中执行的相同操作的问题,并且可能在站点内的特定 URL 中完成,而不是所有站点广泛。
推荐阅读
- git - 在 Github 中添加 git 标签时触发发布管道
- android - 如何为 Google 广告请求的 SSL 跟踪配置 Charles 代理?
- c# - C# - Nunit - nunit3-console 没有在 where 过滤器中选择提到的类文件
- asp.net-core - Asp.net Identity Core 中的 AspNetRoleClaims 有什么意义?
- ruby-on-rails - Rails 模板错误隐式转换字符串到字符串 Heroku
- sas - 如何在 SAS 宏变量中引用控制字符(例如 CRLF)
- c++ - c ++从ifstream读取一个块并写入ofstream
- qt - 将最大长度应用于 QLineEdit
- php - Twilio/PHP - 如何正确编码和解码 URL?
- google-apps-script - 具有三个类似功能的 Google Apps 脚本