Estoy usando las solicitudes para acceder a una API RESTful. Todo parece que funciona. Puedo autenticar, tire hacia atrás de un token de sesión e incluso de la unidad de prueba los métodos de mi clase me escribió para la API. Entonces traté de ejecutar el código.

Primero, aquí está la llamada estoy haciendo. Los encabezados son estáticas sesión de artículos relacionados con el que ponerse en init(). El cuerpo se construye de forma dinámica a partir de datos en un archivo y pasan a esta función. Todos los datos son válidos.

response = requests.post(url, headers=(Requestheader), data=json.dumps((Requestbody)))

Cuando ejecuto el código, que se actualiza de más de 100 registros con los metadatos de la oferta. En algún lugar alrededor de artículo 150 me sale lo siguiente:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: certificado autofirmado en el certificado de
de la cadena (_ssl.c:1045)

Mi primer paso fue llamar al proveedor para averiguar si TODOS sus servidores web había debidamente firmado certs pensando que eran de equilibrio de carga de mí y me encontré con un mal configurado el servidor. Me dicen que este no es el caso.

Luego busqué en Google el mensaje y que se compruebe kwarg, así que he intentado:

response = requests.post(url, headers=Requestheader, data=json.dumps(Requestbody), verify=False)

Sé que esto no es lo ideal a largo plazo, pero quise probar para ver si el comportamiento es El mismo. Lo hizo la misma cosa. Funcionó por un tiempo y tiró el error de ssl. Pensé que la idea de verificar=False es que no marque.

El vendedor me sugirió que verifique la dirección url que estoy usando, pero está bien. Yo creo que si hay un servidor proxy o un hombre de verdad-en-el-ataque medio causando problemas yo no ver el éxito muchas veces antes de que un fracaso. Pensé que tal vez es un tiempo de espera de sesión, pero que debe lanzar un plan 401 de estado y mi nivel de actividad es demasiado alto para un tiempo de espera de inactividad.

Soy un python noob y no un profesional de la seguridad. Sugerencias apreciado.

  • La versión de requests? Usted debe tratar de agregar más de depuración o capturar el tráfico para ver cada certificado que se obtiene, y ver qué cambios. verify=False es en todos los casos, no es algo que se debe mantener.
InformationsquelleAutor Tim B | 2018-07-17

2 Comentarios

  1. 1

    Por lo que el problema podría tener tres resoluciones como yo lo veo:

    1. Un certificado de que está bien y que hay algo mal con el código. El problema puede producirse, por ejemplo, mientras que el uso de preparados solicitudes como se describe en esta solución

      Pero la verdad creo que no es tu caso porque en el fragmento de código que usted ha proporcionado ninguna de tales métodos utilizados. Para los próximos dos variantes, usted necesita para obtener la dirección URL que se genera un error y explorar su certificado (se puede hacer a través del navegador).

    2. Un certificado está bien, pero una autoridad de certificación que firmó no está incluido en la lista CA que es utilizado por las solicitudes de la biblioteca. Después de abrir un preocupante URL de verificación de CA en ella y ver si las fechas son válidas y se incluye en este lista. Si no, en el enlace que me dio en 1. hay una guía sobre cómo agregar CA en la lista de confianza para las solicitudes de la biblioteca.

    3. Un certificado no es válido o auto-firmado. La misma solución que en el 2.

    La solución general es envolver el script en la try except cláusula y imprimir todas las direcciones Url que resultará en errores. A continuación, pruebe a solicitud de ellos uno por uno a través de solicitudes de la biblioteca y ver si se produce el problema. Si lo hace, es (2) o (3) caso. Si no, trate de ejecutar la secuencia de comandos en otra máquina con frescos instalado python y reqests. Si la carrera va a tener éxito, entonces hay algún problema en la configuración.

    • Gracias por la respuesta integral. He aprendido un par de cosas. 1) yo debería ser el uso de sesiones desde que llamar a un número de Api en el sitio 2) me hizo mirar de nuevo en el cert de la cadena y parece que hay dos caminos. En la segunda ruta de acceso no es un certificado autofirmado. ssllabs.com/ssltest/analyze.html?d=api.riscnetworks.com voy a mirar en su primer enlace de nuevo sobre cómo agregar la confianza.
  2. 4

    He encontrado esto sobre aquí

    He encontrado esta solución, insertar este código al principio del archivo de código fuente:

    import ssl
    
    try:
        _create_unverified_https_context = ssl._create_unverified_context
    except AttributeError:
        # Legacy Python that doesn't verify HTTPS certificates by default
        pass
    else:
        # Handle target environment that doesn't support HTTPS verification
        ssl._create_default_https_context = _create_unverified_https_context
    • Esto no es aconsejable. solicitudes verificar=False opción que puede desactivar la comprobación de SSL. Sin embargo, esto significa que usted ya no es la comprobación de que la máquina con la que está hablando es el que quiere hablar con el. Se deja abierta a un hombre en el ataque medio. Mi última solución fue agregar un reintento de decorador en todos mis funciones de llamadas del proveedor de la API.
    • Desde que estaba en el interior de ventana acoplable hablando de un recipiente a otro y no quiero ir a la adición de un CA yo válido en ambos contenedores, esta fue exactamente la solución.

Dejar respuesta

Please enter your comment!
Please enter your name here