İstemcideki "istekler" modülünü ve sunucudaki "flask-restful" ı (TLS1.2)kullanarak https istekleri için kendinden imzalı sertifika nasıl doğrulanır

0

Soru

Ş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.

flask flask-restful self-signed tls1.2
2021-11-23 18:09:50
1

En iyi cevabı

0

Aşağıdaki hatadan, [url of server] ihtiyacı bir gerçek gibi olması için host + port örneğin 127.0.0.1:8000

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)')))
2021-12-03 16:30:10

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................