2011-10-31 7 views
15

Ho un file di chiave privata e CERT. Sto usando cUrl e PHP per connettermi a un altro servizio. Al momento, ho cert e inserire i file e funziona perfettamente bene con seguente codice:Passaggio di .PEM e .KEY come stringa in Curl utilizzando 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); 

La mia domanda è: Posso passare cert e la chiave come stringhe piuttosto li passa come file? Ho provato semplicemente passando contenuti dei rispettivi file come stringhe come questo:??

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

... e inutile dire ... non ha funzionato :(

Tutte le idee puntatori suggerimenti ???

+0

Posso chiederti quale file '.key' fornisci? Ho solo il file '.pem'. –

risposta

21

La risposta è purtroppo facile come è semplice:.! No, non è possibile

Il libcurl sottostante non ha alcuna API per la fornitura chiavi come stringhe, solo come file

materiale Bonus:

Se sei sicuri che il vostro libcurl è costruito con OpenSSL, si può effettivamente utilizzare l'opzione CURLOPT_SSL_CTX_FUNCTION per farlo. Tuttavia:

  1. che lo rende un libcurl + soluzione specifica OpenSSL

  2. Non credo PHP/CURL espone che la funzione (abbastanza) per consentire questo. Probabilmente avrebbe bisogno di estendere il codice vincolante prima ...

(Vorrei aggiungere che io sono l'autore principale e manutentore di libcurl.)

+0

Ci sono nomi di file speciali, supportati da PHP e uno di essi è lo stream 'php: // memory'. Libcurl supporta tale nome file? (non testato) – lisachenko

+0

Non lo so. Se funzionano come normali file su libcurl, funzioneranno, ma dubito che lo facciano, suppongo che non funzionino ... –

+0

@Alexander: per le opzioni con valori stringa (ad es. CURLOPT_URL, CURLOPT_SSLCERT, ecc.), 'Php-curl' converte semplicemente il valore passato in una C-string e lo passa direttamente a' libcurl'. Poiché 'libcurl' non sa nulla di' php: // memory', non è possibile. – netcoder

3

È possibile creare i file temporanei, scrivere le stringhe in i file e quindi puntare ai file temporanei ...

8

L'utilizzo di tmpfile() potrebbe essere sufficiente per ovviare al problema.

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

e poi:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

ma assicuratevi di chiuderlo dopo così il file tmp è eliminare

fclose($tempPemFile); 
0

Io non sono esperto, ma SSL CURLOPT_SSLKEY è di file private.pem del file CURLOPT_SSLCERT public.pem?

miei parametri

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

provare la mia risposta suggerita e fammi sapere se è utile o meno.