Comment vérifier un certificat auto-signé pour les requêtes https à l'aide de la "demande" du module sur le client et "en flacon de repos" sur le serveur (TLS1.2)

0

La question

Voici ce que j'ai jusqu'à présent. À l'aide d'openssl, j'ai maintenant ces fichiers: ca.crt, ca.la clé, ca.srl, serveur.crt, serveur.la rse, serveur.clé.

J'ai suivi ce tutoriel: https://carolinafernandez.github.io/development/2017/09/13/HTTPS-and-trust-chain-in-Flask

Et maintenant que le serveur:

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)

Sur la machine cliente, j'ai ce code. J'ai aussi copié ca.crt sur cette machine:

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()

Après le démarrage de l'api du serveur, puis en exécutant le code du client, j'obtiens ce message d'erreur au client:

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)')))

Le but de cela est de sorte que je peux avoir un serveur à l'autre de la communication. Pour l'avenir prévisible, il va littéralement être un serveur qui envoie les requêtes https vers un autre serveur. Suis-je utiliser le mauvais format de fichier pour tout ce que le client doit utiliser pour vérifier? Je ne suis pas un expert dans TLS par tous les moyens, donc je ne sais pas vraiment la différence entre l'ensemble des extensions de fichier (j'ai vu .fichier pem être utilisé dans vérifier, par exemple).

À l'intérieur du lien que j'ai montré plus tôt, j'ai aussi essayé la voie de production du client.pem et de l'aide que dans le champ confirmer.

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

La meilleure réponse

0

À partir de l'erreur ci-dessous, [url of server] doit être comme un réel host + port par exemple 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

Dans d'autres langues

Cette page est dans d'autres langues

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