2011-11-30 18 views
21

Estoy tratando de escribir un script pycurl para acceder a un sitio seguro (HTTPS).pycurl y SSL cert

c = pycurl.Curl() 
c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0') 
c.setopt(pycurl.URL, 'https://for-example-securedsite') 
c.setopt(pycurl.COOKIEFILE, 'cookie.txt') 
c.setopt(pycurl.COOKIEJAR, 'cookies.txt') 
c.setopt(pycurl.WRITEDATA, file("page.html","wb")) 

estoy recibiendo el error abajo ..

pycurl.error: (60 'problema de certificado SSL, compruebe que el certificado CA está bien Detalles:. \ NError: 14090086: Rutinas SSL: SSL3_GET_SERVER_CERTIFICATE : la verificación del certificado falló ')

El código falló, ya que no pudo obtener el certificado SSL.

El error desapareció si agrego las líneas a continuación a mi código.

c.setopt(pycurl.SSL_VERIFYPEER, 0) 
c.setopt(pycurl.SSL_VERIFYHOST, 0) 

El código anterior omitirá la verificación del certificado. Pero está sujeto al ataque 'hombre en el medio'.

Sé que tengo el certificado SSL en mi almacén de certificados local. ¿Alguien sabe cómo exportar mi certificado y usarlo mi código ... Algunos códigos de muestra serán increíbles ...

Gracias por su tiempo!

Respuesta

18

Tienes razón, la forma en que lo haces te somete a un ataque de hombre en el medio, especialmente a la luz del most recent SSL vulnerabilities. Puede resolverlo de la siguiente manera:

import pycurl 
curl = pycurl.Curl() 
curl.setopt(pycurl.URL, "https://your-secure-website.com/") 
curl.setopt(pycurl.SSL_VERIFYPEER, 1) 
curl.setopt(pycurl.SSL_VERIFYHOST, 2) 
curl.setopt(pycurl.CAINFO, "/path/to/updated-certificate-chain.crt") 
curl.perform() 

curl de forma predeterminada viene con una lista de certificados desactualizados. Si desea actualizarlo o simplemente usar sus propios certificados para realizar pruebas, asegúrese de colocar el archivo actualizado-certificado-cadena.crt en una ubicación accesible y use la opción pycurl.CAINFO para señalarlo.

También asegúrese de que pycurl.SSL_VERIFYHOST esté configurado en 2, la configuración de comprobación de seguridad más alta.

1

¿Leyó la documentación del cURL about SSL certificates? Esto parece dirigirse directamente a su pregunta ..., en particular, el artículo 2:

2. Get a CA certificate that can verify the remote server and use the proper 
    option to point out this CA cert for verification when connecting. For 
    libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath); 

Parece que el módulo pycurl contiene la opción CAPATH, por lo que este debe ser sencillo de aplicar en el código.

+0

Gracias por su respuesta .. He leído el artículo .. Luego traté de obtener el certificado utilizando curl.exe con las siguientes opciones .. curl.exe --cacert test.crt https: // secure-site/.. Recibí el siguiente error ... "curl: (1) Protocolo https no soportado o deshabilitado en libcurl" ... ¿Alguna idea de cómo puedo solucionarlo? – K2M

+0

Descargué la fuente de curl y la compilé por mi cuenta. Acabo de recibir una url en la que puedo descargar Curl.exe "http://curl.haxx.se/latest.cgi?curl=win32-ssl-devel-". msvc "... ¡Voy a explorar eso! – K2M