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.