У меня есть http-запрос, который использует ключ, сертификат и цепочку сертификатов. Как это можно перевести на Guzzle? Проблема в том, что я не знаю, как добавить все свои сертификаты в запрос Guzzle. В документации есть пример только для одного сертификата
Пример моего запроса:
// curl -vvv -X POST --header 'Content-Type: application/x-www-form-urlencoded' --header 'Accept: application/json' --cacert client-bundle.pem --key key.pem --cert cert.pem 'my_url'
Моя функция отправляет запрос с помощью Guzzle на данный момент:
try {
$response = $this->request('POST', 'my_url', [
'headers' => [
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/json'
],
]);
return Json::decode($response->getBody()->getContents());
$this->checkResponse($result);
} catch (GuzzleException $e) {
return $e->getMessage();
}
Пытался найти пример отправки запроса с передачей нескольких сертификатов. Я не смог найти такой пример, использование только одного сертификата меня не устраивает
Чтобы добавить несколько сертификатов в запрос Guzzle, вы можете использовать параметры ssl_key и cert в массиве параметров запроса. Параметр ssl_key может быть установлен на путь к вашему файлу закрытого ключа, а параметр cert может быть установлен на путь к вашему файлу сертификата.
$certFile = 'cert.pem';
$keyFile = 'key.pem';
$caFile = 'client-bundle.pem';
$client = new GuzzleHttp\Client();
try {
$response = $client->request('POST', 'my_url', [
'headers' => [
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/json'
],
'cert' => [$certFile, $keyFile],
'ssl_key' => $keyFile,
'verify' => $caFile
]);
$result = $response->getBody()->getContents();
$this->checkResponse($result);
return Json::decode($result);
} catch (GuzzleHttp\Exception\GuzzleException $e) {
return $e->getMessage();
}
С помощью команды cat я объединил сертификаты в один файл
cat *.pem >> cert-pem-bundle.pem
После этого полученный файл использовался в параметре cert. Конечная функция:
try {
$response = $this->request('POST', 'my_url', [
'headers' => [
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/json'
],
'cert' => ['/app/cert-pem-bundle.pem', 'testtest'], // testtest - pass phrase
]);
$result = Json::decode($response->getBody()->getContents());
return $result;
} catch (GuzzleException $e) {
return $e->getMessage();
}
Я согласен. Но это было первое решение, которое я нашел. Позже я использовал решение, предложенное Мехди
Похоже на плохую практику объединения ключей в один файл.