Как сделать взаимную / двустороннюю аутентификацию с помощью php curl? - PullRequest
0 голосов
/ 18 апреля 2019

На веб-сайте написано: «Вы не аутентифицированы с помощью цифрового сертификата, или, возможно, истекло время соединения. Повторная аутентификация с вашим цифровым сертификатом.».

Я получаю это сообщение каждый раз, а не соединениевремя истекает, я думаю, что моя попытка аутентификации просто не работает.

То, как я это делаю, я начинаю с простого файла pfx и парольной фразы, чтобы открыть его.Я делаю сертификат pem с openssl и pfx.

Код:

<?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);

Результат выполнения кода (показывает только цитату из HTML $ curl_result):

Вы не заверены с цифровым сертификатом, или, возможно, время подключения истекло.Повторная аутентификация с цифровым сертификатом.

Кстати, $curl_info['ssl_verify_result'] равен 0, что, я думаю, означает, что по крайней мере сервер был правильно аутентифицирован.

РЕДАКТИРОВАТЬ: удалено CURLOPT_SSLCERTPASSWD, поскольку в этом нет необходимости, файл pfx уже был открыт с паролем, а его закрытый и открытый ключи были обнажены в $cert_path.

1 Ответ

0 голосов
/ 19 апреля 2019

Для успешной аутентификации на этом конкретном сайте необходим заголовок.Отсутствующим заголовком был Cookie: ..., который содержал определенные поля, например, идентификатор сеанса (который вы можете получить, войдя на сайт с помощью 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, который зависит от каждого сайта и выходит за рамкивопрос, но в целом это вопрос имитации с PHP той же операции, что пользователь делает в браузере, и, вероятно, это делается в частиобычный URL на сайте, а не весь сайт в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...