Foros del Web » Programando para Internet » PHP »

Conectar con curl a https con certificado

Estas en el tema de Conectar con curl a https con certificado en el foro de PHP en Foros del Web. Buenas a todos, veréis, tengo un problema para conectar con un servidor mediante SSL. He buscado por el foro pero no he encontrado nada parecido. ...
  #1 (permalink)  
Antiguo 21/08/2009, 01:11
 
Fecha de Ingreso: noviembre-2005
Mensajes: 28
Antigüedad: 18 años, 5 meses
Puntos: 0
Conectar con curl a https con certificado

Buenas a todos,

veréis, tengo un problema para conectar con un servidor mediante SSL. He buscado por el foro pero no he encontrado nada parecido.

El problema es que estoy intentando enviarle información al servidor a través de cURL pero ni siquiera consigo la autenticación con el certificado.

Para empezar, el certificado lo he obtenido a través de Firefox. Me he conectado a la url https:xxx y he exportado el certificado en ".pem". Con firefox puedo ver sin problemas la web bajo SSL pero el problema viene cuando intento conectar con curl.

El código que utilizo es el siguiente:

Código PHP:
$ch curl_init();

curl_setopt($chCURLOPT_URL$this->_url );
curl_setopt($chCURLOPT_RETURNTRANSFER);
curl_setopt($chCURLOPT_TIMEOUT15 );
curl_setopt($chCURLOPT_HTTPHEADER$headers );
curl_setopt($chCURLOPT_SSL_VERIFYPEERtrue );
curl_setopt($chCURLOPT_SSL_VERIFYHOSTtrue );        
curl_setopt($chCURLOPT_SSLCERT,  'cert/certificado.pem');
curl_setopt($chCURLOPT_POST);
curl_setopt($chCURLOPT_POSTFIELDSutf8_encode$msg ) );
        
$data  curl_exec$ch );
$error curl_errno$ch );
curl_close$ch ); 
Pero obtengo el error:
Error:unable to set private key file: 'cert/certificado.pem' type PEM

Al parecer debo de indicar también una key privada, pero ¿de donde la obtengo?, cuando exporto el certificado desde firefox no veo ninguna opción para exportar ninguna key y sin embargo Firefox puede ver la web via https, por lo que el tiene todo lo necesario para poder autenticarse.

Os agradecería vuestra ayuda ya que estoy un poco desesperado.

Gracias de antemano y un saludo.
  #2 (permalink)  
Antiguo 21/08/2009, 01:15
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Conectar con curl a https con certificado

Debes enviar el contenido del certificado, solo estas enviando el nombre, tal vez te sirva usar:

file_get_contents()

curl_setopt($ch, CURLOPT_SSLCERT, file_get_contents('cert/certificado.pem'));
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 21/08/2009, 01:32
 
Fecha de Ingreso: noviembre-2005
Mensajes: 28
Antigüedad: 18 años, 5 meses
Puntos: 0
Respuesta: Conectar con curl a https con certificado

Lo he probado pero nada, obtengo el error:

Error 58
Error:unable to use client certificate (no key found or wrong pass phrase?)



De todas maneras he mirado la documentación de PHP y para la opción CURLOPT_SSLCERT tengo la descripción:

The name of a file containing a PEM formatted certificate.
  #4 (permalink)  
Antiguo 21/08/2009, 02:02
 
Fecha de Ingreso: noviembre-2005
Mensajes: 28
Antigüedad: 18 años, 5 meses
Puntos: 0
Respuesta: Conectar con curl a https con certificado

Por si a alguien le puede ayudar, si ejecuto en la línea de comandos:

openssl s_client -host xxx -port 443 -CAfile certificado.pem

El servidor me devuelve:

CONNECTED(00000003)

El certificado

---
No client certificate CA names sent
---
SSL handshake has read 2686 bytes and written 300 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: 8A150000DE606...
Session-ID-ctx:
Master-Key: D64652979BC14C...
Key-Arg : None
Start Time: 1250841588
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
  #5 (permalink)  
Antiguo 21/08/2009, 02:31
 
Fecha de Ingreso: noviembre-2005
Mensajes: 28
Antigüedad: 18 años, 5 meses
Puntos: 0
Respuesta: Conectar con curl a https con certificado

Bueno creo que he resuelto el problema del certificado. Os dejo aquí los pasos que he seguido para hacerlo funcionar:

1. Me he conectado con firefox a la web https:xxx y he exportado el certificado en formato X.509 Certificate (PEM) guardandolo con el nombre certificado.crt.

Para exportar el certificado solo es necesario hacer click con el botón derecho sobre la web y elegir View Page Info (tengo el firefox en inglés) . Después seleccionamos la pestaña Security y View Certificate. En la pestaña Details seleccionamos el item padre (el de más arriba de todos) en Certificate Hierarchy y pulsamos el botón export de más abajo.

2. He copiado el fichero .crt al directorio raíz de la aplicación en php

3. He modificado el código php que ha quedado tal que así:

Código PHP:
$ch curl_init();
curl_setopt($chCURLOPT_URL$this->_url );
curl_setopt($chCURLOPT_RETURNTRANSFER);
curl_setopt($chCURLOPT_TIMEOUT15 );
curl_setopt($chCURLOPT_HTTPHEADER$headers );
curl_setopt($chCURLOPT_SSL_VERIFYPEERtrue );
curl_setopt($chCURLOPT_SSL_VERIFYHOST);        
curl_setopt($chCURLOPT_CAINFOgetcwd().'/certificado.crt' );
curl_setopt($chCURLOPT_POST);
curl_setopt($chCURLOPT_POSTFIELDSutf8_encode$msg ) );
                        
$data  curl_exec$ch );
$error curl_errno$ch );
curl_close$ch ); 
Y eso es todo, ya puedo autentificar el servidor y poder enviarle información.

Un saludo.
  #6 (permalink)  
Antiguo 08/07/2012, 06:34
 
Fecha de Ingreso: julio-2012
Mensajes: 1
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Conectar con curl a https con certificado

Buenos días a todos;

Creo que tengo el mismo problema que ya se trató en este hilo hace tiempo pero no soy capaz de solucionarlo.

Necesito cargar en una variable el código fuente de una web, concretamente esta: https://www.magiccardmarket.eu/Naturalize_%28Innistrad%29.c1p250635.prod

He probado con CURL y con FGET pero no soy capaz.

Creo que el problema reside en el certificado. He seguido los pasos de exportarlo como se comentaba en este último mensaje y cargarlo al servidor y ya no me devuelve el error de "Error 403: You do not have the necessary credentials to access the requested URL".

Pero, sin embargo, tampoco carga nada en la variable...

$url="https://www.magiccardmarket.eu/Naturalize_%28Innistrad%29.c1p250635.prod";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'certificado.crt' );
$file_contents = curl_exec($ch);
curl_close($ch);

echo $file_contents;


¿Alguna idea?

Os lo agradezco mucho.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:37.