Вот что у меня есть на данный момент. Используя openssl, у меня теперь есть эти файлы: ca.crt, ca.key, ca.srl, server.crt, server.csr, server.key.
Я следовал этому уроку: https://carolinafernandez.github.io/development/2017/09/13/HTTPS-and-trust-chain-in-Flask
И теперь имейте это в качестве сервера:
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)
На клиентской машине у меня есть этот код. Я также скопировал ca.crt на эту машину:
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()
После запуска серверного api и последующего запуска клиентского кода я получаю это сообщение об ошибке на клиенте:
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)')))
Цель этого состоит в том, чтобы у меня была безопасная связь между серверами. В обозримом будущем это будет буквально один сервер, отправляющий https-запросы на другой сервер. Я использую неправильный формат файла для всего, что клиент должен использовать для проверки? Я никоим образом не эксперт в TLS, поэтому я действительно не знаю разницы между всеми расширениями файлов (например, я видел файл .pem, используемый в verify).
Внутри ссылки, которую я показывал ранее, я также попробовал создать файл client.pem и использовать его в поле проверка.