У меня на сервере Apache есть php-скрипт, которому необходимо отправить запрос на завиток на сервер партнера. Партнер дайте мне файл .pem, который я должен подключить к каждому звонку, который я делаю, к его api.
Мой PHP-скрипт следующий:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSLCERT, "test.pem" ); curl_setopt($ch,CURLOPT_SSLCERTTYPE,"PEM"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, True); curl_setopt($ch, CURLOPT_POST, True); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, $json); curl_setopt($ch, CURLOPT_VERBOSE, true); $result = curl_exec($ch); if(!$result) { echo "Curl Error: " . curl_error($ch); } else { echo "Success: ". $result; } curl_close($ch);
Он возвращает:
Ошибка Curl: невозможно установить файл закрытого ключа: тип test.pem PEM
Подумайте, что он отправляет мне .pem-файл и говорит: «у него нет кодовой фразы»,
Я думаю, что вам нужно использовать tmpfile () и stream_get_meta_data .
$pemFile = tmpfile(); fwrite($pemFile, "test.pem");//the path for the pem file $tempPemPath = stream_get_meta_data($pemFile); $tempPemPath = $tempPemPath['uri']; curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath);
Источник: Этот ответ здесь в SO помогает мне с аналогичной проблемой.
Я думаю, что вам не хватает curl_setopt($ch, CURLOPT_CAINFO, 'test.pem');
Посмотрите, что cURL не может использовать клиентский сертификат, на локальном сервере, чтобы больше узнать об использовании клиентских сертификатов в curl через PHP