Я использовал 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, который использовал самоподписанный сертификат? Как? Любая подсказка приветствуется;) Спасибо за вашу помощь.
Ак Тек
Задача ещё не решена.
Других решений пока нет …