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.