Передача .PEM и .KEY как строки в Curl с использованием PHP - PullRequest
16 голосов
/ 31 октября 2011

У меня есть CERT и файлы закрытых ключей.Я использую cUrl и PHP для подключения к другому сервису.На данный момент у меня есть сертификат и ключ в файлах, и он прекрасно работает со следующим кодом:

$pemfile = "cert.pem";
$keyfile = "private_key.key";
$url = "someTestUrl";
$requestXml = "requestData";

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); 
curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
curl_setopt($ch, CURLOPT_SSLCERT, $pemfile); 
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 
curl_setopt($ch, CURLOPT_SSLKEY, $keyfile); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXml);
$ret = curl_exec($ch);

Мой вопрос: могу ли я передать сертификат и ключ как строки, а не передать их как файлы?Я попытался просто передать содержимое соответствующих файлов в виде строк:

$pemfile = "-----BEGIN CERTIFICATE-----CERTDATAASSTRING-----END CERTIFICATE-----";
$keyfile = "-----BEGIN RSA PRIVATE KEY-----PRIVATEKEYINCODE-----END RSA PRIVATE KEY-----";

... и, разумеется, ... это не сработало: (

Есть идеи? Указатели?предложения ???

Ответы [ 4 ]

24 голосов
/ 13 июня 2012

К сожалению, ответ так же прост, как и прост: нет, это невозможно.

Базовый libcurl не имеет API для предоставления ключей в виде строк, только в виде файлов!

Бонусный материал:

Если вы уверены , что ваш libcurl собран с OpenSSL, вы можете использовать опцию CURLOPT_SSL_CTX_FUNCTION , чтобы сделать это. Однако:

  1. , что делает его специальным решением для libcurl + OpenSSL

  2. Я не думаю, что PHP / CURL предоставляет эту функцию (достаточно), чтобы позволить это. Вам, вероятно, нужно сначала расширить код привязки ...

(Я должен добавить, что я являюсь основным автором и сопровождающим libcurl.)

10 голосов
/ 14 июня 2012

Использование tmpfile() может быть достаточным в качестве обходного пути.

$tempPemFile = tmpfile();
fwrite($tempPemFile, $pemfile);
$tempPemPath = stream_get_meta_data($tempPemFile);
$tempPemPath = $tempPemPath['uri'];

и затем:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

но убедитесь, что вы закрыли его после того, как файл tmp будет удален

fclose($tempPemFile);
3 голосов
/ 14 июня 2012

Вы можете создавать временные файлы, записывать строки в файлы и затем указывать на временные файлы ...

0 голосов
/ 22 июня 2017

Я не эксперт по SSL, но CURLOPT_SSLKEY - это файл private.pem файла public.pem CURLOPT_SSLCERT?

Мои параметры

CURLOPT_CAINFO => /path/cacert.pem
CURLOPT_SSLKEY => /path/private.pem
CURLOPT_SSLCERT => /path/public.pem

Попробуйте мой предложенный ответ и дайте мне знать, еслиполезно это или нет.

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