Cómo verificar el certificado autofirmado para las solicitudes https utilizando la opción "solicitudes" del módulo en el cliente y "matraz de descanso" en el servidor (TLS1.2)

0

Pregunta

Aquí es lo que tengo hasta ahora. Usando openssl, ahora tengo estos archivos: ca.crt, ca.clave, ca.srl, servidor.crt, servidor.la rse, en el servidor.clave.

He seguido este tutorial: https://carolinafernandez.github.io/development/2017/09/13/HTTPS-and-trust-chain-in-Flask

Y ahora esta como el servidor:

from flask import Flask, request
from flask_restful import Resource, Api, reqparse
import psycopg2
import ssl
import sys

app = Flask(__name__)
api = Api(app)

# TODO: https security
HTTPS_ENABLED = True
VERIFY_USER = True

API_HOST = "0.0.0.0"
API_PORT = 8000
API_CRT = "server.crt"
API_KEY = "server.key"
API_CA_T = "ca.crt"

context = None
if(HTTPS_ENABLED):
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    
    if(VERIFY_USER):
        context.verify_mode = ssl.CERT_REQUIRED
        context.load_verify_locations(API_CA_T)

    try:
        context.load_cert_chain(API_CRT, API_KEY)
    except Exception as e:
        sys.exit("Error starting server: {}".format(e))

...[implementation of api]...

if __name__ == '__main__':
    app.run(ssl_context=context, host=API_HOST, port=API_PORT, debug=True)

En la máquina cliente, tengo este código. También he copiado ca.crt a que la máquina:

import os
import requests
import ssl

def test():
    response = requests.get("https://[url of server]:8000/helloworld", verify='ca.crt')
    #response = requests.get("http://[url of server]:8000/helloworld")
    print(response.text);

def print_version():
    print(ssl.OPENSSL_VERSION)

if __name__ == "__main__":
    test()
    #print_version()

Después de iniciar el servidor de la api y, a continuación, ejecuta el código de cliente, me sale este mensaje de error en el cliente:

requests.exceptions.SSLError: HTTPSConnectionPool(host='[url of server]', port=8000): Max retries exceeded with url: /helloworld (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1123)')))

El propósito de esto es para que yo pueda tener de servidor seguro para la comunicación con el servidor. Para el futuro previsible, es, literalmente, ser un servidor de envío de las solicitudes https en otro servidor. Estoy utilizando mal el formato de archivo para lo que el cliente tiene que utilizar para verificar? Yo no soy un experto en TLS, por cualquier medio, así que realmente no saben la diferencia entre la totalidad de las extensiones de archivo (he visto una .pem archivo que se utiliza en verificar, por ejemplo).

Dentro del enlace que me mostró anteriormente, también probé la ruta de producción del cliente.pem y el uso que en el campo verificar.

flask flask-restful self-signed tls1.2
2021-11-23 18:09:50
1

Mejor respuesta

0

Desde el siguiente error, [url of server] debe ser como una real host + port por ejemplo 127.0.0.1:8000

requests.exceptions.SSLError: HTTPSConnectionPool(host='[url of server]', port=8000): Max retries exceeded with url: /helloworld (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1123)')))
2021-12-03 16:30:10

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................