2011-10-31 21 views
15

Tengo un CERT y archivos de clave privada. Estoy usando cUrl y PHP para conectarme a otro servicio. Por el momento, no tengo certificado y la clave de archivos y funciona perfectamente bien con el código siguiente:Pasando .PEM y .KEY como una cadena en Curl usando 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); 

Mi pregunta es: ¿Puedo pasar cert y la clave en forma de cadenas en lugar de paso como archivos? He intentado simplemente pasando contenido de los archivos respectivos en forma de cadenas como esta:??

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

... y ni que decir ... no funcionó :(

Cualquier idea punteros sugerencias ???

+0

¿Puedo preguntar qué archivo '.key' usted proporciona? Solo tengo el archivo '.pem'. –

Respuesta

21

La respuesta es, por desgracia tan fácil como lo es simple:.! no, no es posible

El libcurl subyacente no tiene ninguna API para proporcionar claves como cadenas, sólo como archivos

material de Bono:

Si estás seguro de que su libcurl se construye con OpenSSL, en realidad se puede utilizar la opción CURLOPT_SSL_CTX_FUNCTION para hacerlo. Sin embargo:

  1. que lo convierte en una solución específica libcurl + OpenSSL

  2. No creo que PHP/CURL expone que la función (suficiente) para permitir esto. Es probable que tenga que ampliar el código de enlace de primera ...

(debo añadir que yo soy el autor principal y mantenedor de libcurl.)

+0

Hay nombres de archivos especiales, compatibles con PHP y uno de ellos es la transmisión 'php: // memory'. ¿Libcurl admite dicho nombre de archivo? (no probado) – lisachenko

+0

No lo sé. Si funcionan como archivos regulares en libcurl, entonces funcionarán, pero dudo que lo hagan, supongo que no funcionarán ... –

+0

@Alexander: para las opciones con valores de cadena (por ejemplo, CURLOPT_URL, CURLOPT_SSLCERT, etc.), 'php-curl' simplemente convierte el valor pasado en una cadena C y lo pasa directamente a' libcurl'. Como 'libcurl' no sabe nada de' php: // memory', no es posible. – netcoder

3

Se puede crear archivos temporales, escribir las cadenas en los archivos y luego apunte a los archivos temporales ...

8

Usar tmpfile() podría ser suficiente como una solución.

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

y luego:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

pero asegúrese de que se cierre después de que el archivo tmp es eliminar

fclose($tempPemFile); 
0

No soy experto pero SSL es CURLOPT_SSLKEY archivo private.pem del archivo CURLOPT_SSLCERT public.pem?

Mis parámetros

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

intentar mi Respuesta posible y quiero saber si es útil o no.

Cuestiones relacionadas