ssl — Как создать контекст для PHP fopen () для доступа к URL-адресу с собственной подписью и необходимой HTTP-авторизацией?

Я использовал fopen () в домашней функции для доступа к API. Этот API использует самозаверяющий сертификат и требует HTTP-заголовка авторизации для ответа.

С момента перехода с PHP ~ 5.3 на PHP 5.6 все изменилось. Больше нельзя было использовать мой контекст (созданный с помощью stream_context_create()) с моей собственной подписью сертификата. Я много читал здесь о verify_peer, verify_peer_name а также allow_self_signed варианты и все заработало. Теперь я получаю ошибку 401 (вместо fopen() ошибка «Не удалось включить шифрование» у меня ранее была).

Дополнительные тесты позже, я понял, что не могу сделать и это самозаверяющее принятие сертификата и дать Authorization заголовок. Я предполагаю предыдущий вариант verify_peer, verify_peer_name а также allow_self_signed связаны с ssl обертка в то время как Authorization заголовок имеет значение только в http обертка. Это правда?

Чтобы создать мой fopen() контекст, я ранее сделал это (я дал Authorization Заголовок в моем $header parameter):

/**
* Creation of a context for fopen the API
* @param $method string HTTP Method wanted
* @param $header array Associated array of addition header to put into the HTTP request
* @param $content mixed Content of the request
* @return resource Stream context for fopen
*/
function rest_context($method = 'GET', $header = null, $content = null)
{

$http = array(
'method' => mb_strtoupper($method),
'ignore_errors' => true,
'follow_location' => 0,
'max_redirects' => 0
);

// Defaults header
$header_arr = array(
'Content-Type' => 'application/x-www-form-urlencoded'
);

// Request content
if (!is_null($content) && !empty($content))
{
if (is_array($content))
$content = http_build_query($content);
$http['content'] = $content;

$header_arr['Content-Length'] = strlen($content);
}

// En-têtes
if (!is_null($header) && !empty($header))
$header_arr = array_merge($header_arr, $header);
// rest_header_make creates headers well formated for the http request (array to string separeted with \n)
$http['header'] = rest_header_make($header_arr);

// Création et retour du contexte
return stream_context_create(
array('http' => $http)
);
}

Я попробовал следующее решение, чтобы избежать проверки сертификата, но Authorization Заголовок, кажется, игнорируется, я не получаю его при просмотре журнала API. Изменения в опциях контекста и в имени оболочки (ssl вместо http).

/**
* Creation of a context for fopen the API
* @param $method string HTTP Method wanted
* @param $header array Associated array of addition header to put into the HTTP request
* @param $content mixed Content of the request
* @return resource Stream context for fopen
*/
function rest_context_new($method = 'GET', $header = null, $content = null)
{

$http = array(
'method' => mb_strtoupper($method),
'ignore_errors' => true,
'follow_location' => 0,
'max_redirects' => 0,
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
);

// Defaults header
$header_arr = array(
'Content-Type' => 'application/x-www-form-urlencoded'
);

// Request content
if (!is_null($content) && !empty($content))
{
if (is_array($content))
$content = http_build_query($content);
$http['content'] = $content;

$header_arr['Content-Length'] = strlen($content);
}

// En-têtes
if (!is_null($header) && !empty($header))
$header_arr = array_merge($header_arr, $header);
// rest_header_make creates headers well formated for the http request (array to string separeted with \n)
$http['header'] = rest_header_make($header_arr);

// Création et retour du contexte
return stream_context_create(
array('ssl' => $http)
);
}

Есть ли способ дать Authorization заголовок с API, который использовал самоподписанный сертификат? Как? Любая подсказка приветствуется;) Спасибо за вашу помощь.

Ак Тек

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]