Передача .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-----"; 

… и, разумеется, … это не сработало 🙁

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

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

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

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

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

  1. что делает его решением libcurl + OpenSSL

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

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

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

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

а потом:

 curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

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

 fclose($tempPemFile); 

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

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

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

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

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