У меня есть ВМ. Я сгенерировал SSL-сертификаты:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
После этого написал веб-сервер с помощью Flask с аргументом ssl_context:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def index():
return "Flask is running!"
@app.route("/data")
def some_func():
pass
if __name__ == "__main__":
app.run(ssl_context=("cert.pem", "key.pem"))
Теперь у меня есть еще одна виртуальная машина в той же сети, где у меня есть клиентское приложение, которое запрашивает некоторые данные:
import requests
import json
SERVER_URL = 'https://example.com/data'
token = "some_token"
def _send():
query = """some_query"""
data = {'query': query}
headers = {'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': "Bearer %s" % token
}
response = requests.post(SERVER_URL,
data=json.dumps(data).encode('utf-8'),
headers=headers,
verify=Flase)
if response.status_code == 200:
res = json.loads(response.text)
return True, res, None
return False, None, response.text
print(_send())
Теперь мне нужно передать verify
путь аргумента к некоторым сертификатам, которые помогут мне проверить SSL-сертификаты сервера. Но какие файлы мне нужно передать для проверки? Те же cert.pem
и key.pem
, которые я сгенерировал и передал в приложение Flask как ssl_contextor
, или мне нужно сгенерировать другой файл (если да, как я могу сгенерировать/создать этот файл)??
Я немного изменил ваш пример:
CommonName
и SubjectAltName
(в этом примере я использовал domain.test
):openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 -subj /CN=domain.test -addext "subjectAltName = DNS:domain.test"
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def index():
return "Flask is running!"
@app.route("/data", methods=["GET", "POST"]) # <-- add methods= here
def some_func():
return jsonify({"result": "Hello World!"}) # <-- return some example data
if __name__ == "__main__":
app.run(host = "0.0.0.0", port=5000, ssl_context=("cert.pem", "key.pem"))
import requests
import json
SERVER_URL = "https://domain.test:5000/data" # <-- put domain.test here
token = "some_token"
def _send():
query = """some_query"""
data = {"query": query}
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": "Bearer %s" % token,
}
response = requests.post(
SERVER_URL,
data=json.dumps(data).encode("utf-8"),
headers=headers,
verify = "cert.pem", # <-- put cert.pem here
)
if response.status_code == 200:
res = json.loads(response.text)
return True, res, None
return False, None, response.text
print(_send())
Вывод без предупреждений:
(True, {'result': 'Hello World!'}, None)
@Samvel Да, на клиенте нужен только cert.pem.
поэтому мне нужно взять файл cert.pem да???