web-dev-qa-db-ja.com

PHP)を使用して、.PEMと.KEYをCurlの文字列として渡す

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-----";

...そして言うまでもなく...それはうまくいきませんでした:(

何か案は?ポインタ?提案???

18
bianca

残念ながら、答えは単純であると同時に簡単です。いいえ、それは不可能です。

基盤となるlibcurlには、キーを文字列として提供するためのAPIはなく、ファイルとしてのみ提供されます。

ボーナス素材:

sure libcurlがOpenSSLで構築されている場合は、実際に CURLOPT_SSL_CTX_FUNCTION オプションを使用してそれを行うことができます。しかしながら:

  1. それはそれをlibcurl + OpenSSL固有のソリューションにします

  2. PHP/CURLがこれを可能にするためにその関数を(十分に)公開しているとは思いません。おそらく最初にバインディングコードを拡張する必要があるでしょう...

(私がlibcurlの主な作成者およびメンテナーであることを追加する必要があります。)

24
Daniel Stenberg

回避策としては、tmpfile()を使用するだけで十分な場合があります。

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

その後:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

ただし、tmpファイルが削除されるように、必ず閉じてください。

fclose($tempPemFile);
10
MDrollette

一時ファイルを作成し、文字列をファイルに書き込んでから、一時ファイルを指すことができます...

3
orderedanalog

私はSSLエキスパートではありませんが、CURLOPT_SSLKEYはCURLOPT_SSLCERT public.pemファイルのprivate.pemファイルですか?

私のパラメータ

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

私の提案した答えを試してみて、それが役立つかどうか教えてください。

0
Seraly