Como verificar se um certificado auto-assinado para solicitações de https usando a "a pedidos" do módulo sobre o cliente e o "balão-de descanso" no servidor (TLS1.2)

0

Pergunta

Aqui está o que eu tenho até agora. Usando o openssl, agora eu tenho esses arquivos: ac.crt, ca.chave, ac.srl, servidor.crt servidor.csr, servidor.chave.

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

E agora tem esse como o 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)

Na máquina cliente, eu tenho este código. Eu também copiados ca.crt sobre a 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()

Depois de iniciar o servidor de api e, em seguida, executando o código do cliente, recebo esta mensagem de erro no 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)')))

A finalidade disso é para que eu possa ter servidor seguro para a comunicação com o servidor. Para o futuro previsível, é, literalmente, ser um servidor de envio de solicitações de https para outro servidor. Estou usando o errado formato de arquivo para o que o cliente tem que usar para verificar? Eu não sou um expert em TLS, por qualquer meio, então eu realmente não sei a diferença entre todas as extensões de arquivo (eu já vi .pem arquivo que está sendo usado em verificar, por exemplo).

Dentro do link que eu mostrei anteriormente, eu também tentei fazer a rota de produção do cliente.pem e usando que no campo verificar.

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

Melhor resposta

0

O erro abaixo, [url of server] precisa ser real host + port por exemplo 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

Em outros idiomas

Esta página está em outros idiomas

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