如何使用php curl进行双向认证?

时间:2019-04-18 20:56:28

标签: php ssl 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中。 / p>

1 个答案:

答案 0 :(得分:0)

必须有标头才能在该特定站点上成功进行身份验证。缺少的标题为Cookie: ...,其中包含特定字段,例如会话ID(您可以通过使用cURL登录网站或只是通过浏览器作为用户来获取会话ID,可以复制并粘贴生成的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中完成的,而不是在整个网站范围内进行的。