Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

552
Views
la verificación del certificado falló: no se pudo obtener el certificado del emisor local

Estoy tratando de obtener datos de la web usando python. Importé el paquete urllib.request para él, pero durante la ejecución, aparece el error:

 certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)
  • Estoy usando Python 3.7 en Mac OS High Sierra.
  • Estoy tratando de obtener un archivo CSV de: https://s3.amazonaws.com/assets.datacamp.com/production/course_1606/datasets/winequality-red.csv

Cuando cambié la URL a 'http', puedo obtener datos. Pero, creo, esto evita verificar el certificado SSL.

Así que busqué en Internet y encontré una solución: Ejecutar /Applications/Python\ 3.7/Install\ Certificates.command

Esto resolvió mi problema. Pero no tengo conocimiento sobre SSL y similares. ¿Pueden ayudarme a entender lo que realmente hizo para resolver mi problema?

Si es posible, recomiéndeme algún buen recurso para obtener información sobre la seguridad y los certificados. Soy nuevo en esto.

¡Gracias!

Nota: Revisé el enlace: openssl, error de solicitud de python: "falló la verificación del certificado"

Mi pregunta difiere de la del enlace porque quiero saber qué sucede realmente cuando instalo el paquete certifi o ejecuto Install\ Certificates.command para corregir el error. Tengo una pobre comprensión de los valores.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Para cualquiera que todavía se pregunte cómo solucionar esto, obtuve el mío instalando el comando " Install Certificates.command ".

Así es como lo hice,

Instalar Certificates.comad ubicación

Simplemente haga doble clic en ese archivo, espere a que se instale y, en mi caso, estará listo para comenzar.

over 4 years ago · Santiago Trujillo Report

0

Encontré el mismo problema en OSX, mientras que mi código estaba totalmente bien en Linux, ¡y usted dio la respuesta en su pregunta!

Después de inspeccionar el archivo que apuntó a /Applications/Python 3.7/Install Certificates.command , resultó que este comando reemplaza los certificados raíz de la instalación predeterminada de Python con los que se envían a través del paquete certifi .

certifi es un conjunto de certificados raíz. Cada certificado SSL se basa en una cadena de confianza: usted confía en un certificado específico porque confía en el padre de ese certificado, para lo cual confía en el padre, etc. En algún momento, no hay un "padre" y esos son certificados "raíz". Para esos, no hay otra solución que agrupar certificados raíz comúnmente confiables (generalmente grandes compañías de confianza como, por ejemplo, "DigiCert").

Por ejemplo, puede ver los certificados raíz en la configuración de seguridad de su navegador (por ejemplo, para Firefox->Preferencias->Privacidad y seguridad->ver certificados->Autoridades).

Volviendo al problema inicial, y antes de ejecutar el archivo .command , ejecutar esto me devuelve una lista vacía en una instalación limpia:

 import os import ssl openssl_dir, openssl_cafile = os.path.split( ssl.get_default_verify_paths().openssl_cafile) # no content in this folder os.listdir(openssl_dir) # non existent file print(os.path.exists(os.path.join(openssl_dir, openssl_cafile)))

Esto significa que no existe una autoridad de certificación predeterminada para la instalación de Python en OSX. Un posible valor predeterminado es exactamente el proporcionado por el paquete certifi .

Después de eso, solo puede crear un contexto SSL que tenga el valor predeterminado adecuado como el siguiente ( certifi.where() proporciona la ubicación de una autoridad de certificación):

 import platform # ... ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS) ssl_context.verify_mode = ssl.CERT_REQUIRED ssl_context.check_hostname = True ssl_context.load_default_certs() if platform.system().lower() == 'darwin': import certifi ssl_context.load_verify_locations( cafile=os.path.relpath(certifi.where()), capath=None, cadata=None)

y haga una solicitud a una url de python como esta:

 import urllib # previous context https_handler = urllib.request.HTTPSHandler(context=ssl_context) opener = urllib.request.build_opener(https_handler) ret = opener.open(url, timeout=2)
over 4 years ago · Santiago Trujillo Report

0

Esto funcionó en todos los sistemas operativos:

 import ssl import certifi from urllib.request import urlopen request = "https://example.com" urlopen(request, context=ssl.create_default_context(cafile=certifi.where()))
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!