У меня есть файлы 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 для этого. Однако:
что делает его решением libcurl + OpenSSL
Я не думаю, что 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
Попробуйте мой предложенный ответ и сообщите мне, полезно ли это или нет.