Şu ana kadar elimde olan şu. Openssl kullanarak, şimdi bu dosyalara sahibim: ca.crt, ca.anahtar, ca.srl, sunucu.crt, sunucu.csr, sunucu.anahtar.
Bu öğreticiyi takip ettim: https://carolinafernandez.github.io/development/2017/09/13/HTTPS-and-trust-chain-in-Flask
Ve şimdi bunu sunucu olarak al:
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)
İstemci makinede bu kod var. Ayrıca ca'yı da kopyaladım.crt o makineye geçti.:
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()
Sunucu apı'sini başlattıktan ve istemci kodunu çalıştırdıktan sonra istemcide bu hata iletisini alıyorum:
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)')))
Bunun amacı, sunucudan sunucuya güvenli iletişim kurabilmemdir. Öngörülebilir gelecekte, tam anlamıyla https isteklerini başka bir sunucuya gönderen bir sunucu olacaktır. İstemcinin doğrulamak için kullanması gereken her şey için yanlış dosya biçimini kullanıyor muyum? Hiçbir şekilde TLS konusunda uzman değilim, bu yüzden tüm dosya uzantıları arasındaki farkı gerçekten bilmiyorum (bir tane gördüm .örneğin verify'da kullanılan pem dosyası).
Daha önce gösterdiğim bağlantının içinde, müşteriyi üretme yolunu da denedim.pem ve bunu doğrulama alanında kullanma.