Подтвердить что ты не робот

Передача .PEM и .KEY как строка в Curl с использованием PHP

У меня есть файлы CERT и private key. Я использую 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);

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

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

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

Любые идеи? указатели? предложения???

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Использование 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

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

Ответ 4

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

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

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

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