Python 3, как заставить мой браузер запрашивать сертификат аутентификации клиента при подключении к моему сеансу HTTPS - PullRequest
0 голосов
/ 24 апреля 2019

Введение

Я пытаюсь убедиться, что браузер запрашивает сертификат клиента при попытке подключиться к моему прототипу сайта. Цель состоит в том, чтобы клиент и сервер сравнивали сертификаты, проверяли друг друга перед началом общения и, наконец, показывали «мою простую веб-страницу». Для этого я использую Python-3.6, протокол OpenSSL и простой HTML.

Код: Экземпляр сервера HTTPS, Python-3.6

Я работаю в Python 3.6. До сих пор я успешно установил HTTPS-соединение, используя самозаверяющий сертификат. Ниже приведен мой код для обязательного сеанса client-auth server:

#imports
import os, ssl, time
from http.server import HTTPServer as BaseHTTPServer, SimpleHTTPRequestHandler


# Main entry point
if __name__ == '__main__':

    # Run program
    host   = "127.0.0.1"
    port   = 8082
    webDir = "C:\webdir"
    name   = "test"

    Run(host, port, webDir, name)


def Run(host, port, webDir, name):

    # Start WebSocket server (HTTPS)
    while True:

        # start PRIVATE HTTP server (looks for index.html)
        iWebDir             = os.path.join(webDir, name)                
        svr_cert            = 'server.crt'
        svr_key             = 'server.key'
        client_certs        = 'client.crt'

        httpd               = HTTPS.NewSession(host, port, iWebDir, svr_cert, svr_key, client_certs)
        httpd.serve_forever()



# create https session object (socket)
def NewSession(host, port, web_dir, svr_cert, svr_key, client_certs):
        httpd        = HTTPServer(web_dir, (host, port))
        httpd.socket = ssl.wrap_socket( httpd.socket,
                                        server_side=True,
                                        certfile=svr_cert,
                                        keyfile=svr_key,
                                        ca_certs=client_certs,
                                        cert_reqs=ssl.CERT_REQUIRED,
                                        ssl_version=ssl.PROTOCOL_TLSv1)
        return httpd


# Translate custom server-path
class HTTPHandler(SimpleHTTPRequestHandler):
    """This handler uses server.base_path instead of always using os.getcwd()"""
    def translate_path(self, path):
        path        = SimpleHTTPRequestHandler.translate_path(self, path)
        relpath     = os.path.relpath(path, os.getcwd())
        fullpath    = os.path.join(self.server.base_path, relpath)

        return fullpath



# server wrapper to allow for adjusting session base-path
class HTTPServer(BaseHTTPServer):
    """The main server, you pass in base_path which is the path you want to serve requests from"""
    def __init__(self, base_path, server_address, RequestHandlerClass=HTTPHandler):
        self.base_path = base_path
        BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)

Простая веб-страница

Ниже приведена очень простая веб-страница для проверки взаимодействия сервера и клиента после успешного взаимодействия.

index.html

<!doctype html>
<html>
  <head>
    <title>This is the title of the webpage!</title>
  </head>
  <body>
    <p>This is an example paragraph. Anything in the <strong>body</strong> tag will appear on the page, just like this <strong>p</strong> tag and its contents.</p>
  </body>
</html>

Генерация сертификатов

Ниже приведены ключи и сертификаты сервера / клиента, используемые в целях тестирования. Они были созданы с использованием OpenSSL с использованием следующих команд:

Клиент:

openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout client.key -out client.crt

Сервер:

openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout server.key -out server.crt

Файлы сертификатов

Полученные файлы и содержимое были такими, как указано ниже. Естественно, это тестовые параметры, и они не будут использоваться ни в одной производственной среде.

client.key

-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDT5u4kPfSEPalq
Y/+AfSZbZ7HP7nt277jqH7JpR5rJGI3lmZ8epLIeWPIM2eOpGmn5opiODAxKH+57
LVwSIRQ8ts0e9+4p4c1MGvtksFOeL3dW+aZiUY3FlERZF10BpJxp/B1qFOa3j8Q5
4eYxdaOKNKC1Ayma874y7UjXkAw/XZ3WAX/J2wnN2NAFU1fwrWd8EGHuO3IZqBQm
EbWFz+GPStiaUVCTOzeYUhxg9c7N6sttVPwTRRj8AKFpjWXnbN/ss5Ux+FGUOJAW
LLTOyB/UxZBLIU1Kc6aqlNNt5rX/+g841PPgfqTCIslEfy5gfZ8V06waySorFg8G
tSpL4z0vAgMBAAECggEAfvxC9gESyTTSk+k9MljNZbVsf3khEBN0swkvt5urjJtk
XZWEH67+9uTCmSTyI2Kq42inF2js7HbaSYLTTCH6qK+7mLVnSj4A83yv7pUkZwV2
9O5C4WSSGzdRBjrUB6oH+hOV5P6FjLdhFnbjpfwjdy02qYMtqagr8QT1xAiU7lsp
1iznpBmbm6i/BLbdSRrCVDTnu5bcOGOKLe7qKd4oB9wSF+YNvqm81LyHQhHymJLM
ZADsPb8S963gQYx6bFBUb50/46bACbKYtpa/D2iHpymcn1tVVdz/qs1wsnX6QUxI
SOP4RnC6922omx5R9vIV7Y+SaCwlIg2g+uIQFRy/EQKBgQD6mqvWesbndywVdzmR
9m6HvXO2W5kdlk6EkKlTtI5OfMmKyUDHgQz5LVrQkDIdgp1rxngcsk2/op/Ms+q6
xHLvao5xIGfUPNPpjwWl5HpNHhTJg4vUaU0NHpYLx/wjDoklrAeAeqsrYV7jKDwD
z/jOJXGhEm+Y0V6AX/Vbi/qH1QKBgQDYdu7lGe7qn/bZuqkcZb7HqN81oJeq3AbG
UJSQA5n5+F2zh01uiW4PtF3G6pUEYtmuMTLi9aCPQ39PmK0jGCoAJxYc59fT933f
qOG+r9m5ohj0Fq1jzfVtwhcH/1sqpFNzyFoluRJDKF1g8wjYr7O6sBOdctD5gv+/
TPjqK8gW8wKBgQDrr/PUr3vJzSbEuXCHekDRoLfm1ZbXYLlPq83UT4dXAb16rXQj
LZfJ8YHrjPHVFzZ+WhY0xuygQo4Ps1YbeQ6vZIO6mUONM/gJPN2O+6aaSKQ8MV+c
0bwJjq6HPfo/7jfGGlij2LqK/fSDpx9qZnoVRtnrJq+WBbLfAWB8TNW+UQKBgQCP
QG4qqbXmCcTIJHKD+4V9BnHpQIT+qqvFFFCs2eVNeyMviywgKczvkbK50Eab53sd
fyuo7Vq7VLTtDSIPZo9tGHDW4kt/2HqxyEbU9fVFl1OiPVuz//obD+ZEAabommUr
63xVGJxQW2cooM3K8MQlmR7yBKjtZtcvV5YnCqBZJwKBgQC35xOxGIYrbV7Mzkd1
g50S9uhy3XaNtY3fxfqK+YHxaq8XuSSOlkJsf6YE9Qs+qShbLrUSlq6ISn/Rxdbm
JvZVlZRWmZt5gED8ouEUvE/EROL7DQqml0VUd8or67cNaZF2ARbKX6Y3r44fSmKq
63uxO+buCKGN1RsERz9wn6vSkQ==
-----END PRIVATE KEY-----

client.crt

-----BEGIN CERTIFICATE-----
MIID1zCCAr+gAwIBAgIUXxcmGdIz+cQNWFj6t5/1gyNltB4wDQYJKoZIhvcNAQEL
BQAwezELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkFBMRQwEgYDVQQHDAtSYWluYm93
Q2l0eTEQMA4GA1UECgwHRmlhZ29yYTENMAsGA1UECwwEdW5pdDENMAsGA1UEAwwE
bmFtZTEZMBcGCSqGSIb3DQEJARYKZUBtYWlsLmNvbTAeFw0xOTA0MjQxMzEwNTha
Fw0yMDA0MjMxMzEwNThaMHsxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJBQTEUMBIG
A1UEBwwLUmFpbmJvd0NpdHkxEDAOBgNVBAoMB0ZpYWdvcmExDTALBgNVBAsMBHVu
aXQxDTALBgNVBAMMBG5hbWUxGTAXBgkqhkiG9w0BCQEWCmVAbWFpbC5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDT5u4kPfSEPalqY/+AfSZbZ7HP
7nt277jqH7JpR5rJGI3lmZ8epLIeWPIM2eOpGmn5opiODAxKH+57LVwSIRQ8ts0e
9+4p4c1MGvtksFOeL3dW+aZiUY3FlERZF10BpJxp/B1qFOa3j8Q54eYxdaOKNKC1
Ayma874y7UjXkAw/XZ3WAX/J2wnN2NAFU1fwrWd8EGHuO3IZqBQmEbWFz+GPStia
UVCTOzeYUhxg9c7N6sttVPwTRRj8AKFpjWXnbN/ss5Ux+FGUOJAWLLTOyB/UxZBL
IU1Kc6aqlNNt5rX/+g841PPgfqTCIslEfy5gfZ8V06waySorFg8GtSpL4z0vAgMB
AAGjUzBRMB0GA1UdDgQWBBSKu1j4nlNKwMjup6qv+nWWnoiZ2zAfBgNVHSMEGDAW
gBSKu1j4nlNKwMjup6qv+nWWnoiZ2zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4IBAQCRIOmniQ/gebQDYGaPWg4HVtJOqeDVYOxqmokKAUI3qRp2D9kw
oPEl70tsIkkwPmUFh8twDTROTz2IWUu6G98jJsiW5th4ZnTfahsMWMR9i0bxKK8I
GFyTIAA2Rs7PMjKAHY43I6Rd9oNxMyUGH/WmIc884StzQKD4y4Y19WkmQqI/PkiM
J/cS2GlnqT7hzeplMMIVMHn5HFdAEpGrAFs3jXKjmBz+eAics7Ttl9rxhcK8KEjw
W3imeDsynje/GtT86ie7sV4t07kAW0rvFQ030ihAhJourMn2r5Sucd0F+dJQqh5a
bfu4KxuGUvpvmWzP3fGBw8j5iiuqRjbwqXnn
-----END CERTIFICATE-----

server.key

-----BEGIN PRIVATE KEY-----
MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQDIitybmMnZDEgn
lX/gcgqLy7sp+55b3XkSwQgCZ5wFeJaMl/gyz2FkEF8TDdsOdgHltPCSqOCH7HW2
+HRqiHSSQyySQvPEev9RUMe0xLBV0PFcUeklARRamN8Fwpg4m8S2Vrm/jjsQtOiT
kVTO6TkEiZ4Zx27roEHKtM/gp40G7IHjOvYtzEoqRoXPy+w2Ytl3ovwLR72Ubolc
FDyxeWPZUlU4rG2LWtB44rHq3/+pYk2HzViJX0sjpeJO31vz93epa2BCJRBf/IKK
z2sQPzkiWTHSBZrtXIZ3hxPVErRq+DQozuFG0fXcPRoKeUqQjsB1wIEKtVurjsJa
Bm0XH5F/AgMBAAECggEAQEAlIADaopyJvYzrVHiVImbahz/jY6FYega4TzTsyt/w
tAi4b2b71/hazZsB1OdAAl1vOj26+jFrIX0Gp18iof29mPq0aP3TMTVFVogxyrzP
p3lizgVDhSc3RPwsku5tHtI4XsPt7pNXdHf6iPQ13VtN+QppYjqM+anmdB6aU13+
5lTNcrxWFdiPfNTROIoCEq/2gUAzfVIrdNFSVQ73ui+71tSG7LGWr7Ycjng1yZBh
6gaYhGbdzXSURyC6z955VxFQC/5WySkWjBZ9qW0N90AH3lvkPIdl/hHnUyzGLxIF
7Z8wzZgBEedVgnU5eETOxFrqXnr0THKkFlveTjhAoQKBgQD7Ikyn/fPabPhKMxd2
FY8D/hKnIGE40vKdZh9PNUXJzgGT9Rid9L5ITqWfyC+SSNs8PEmmTaGFJeQDzAny
b3UQo7Fe3IHbxZeYo9kZQ8kIETp+IR3B0HNeIbs+PZDaivuOKTWO+S6eZb9OThnm
2MZ1mGbpZkVyY/G9kIKBQYM0cQKBgQDMbZzmkiRJVO6tqmGBRH/F9TeCUZx9l7Sb
JqF7eJnoxHkZQrHw27LQi+myewAQTe6yEZt9IuON+eyeTFi1/foaYz7AwAnBxUzW
bdgfWSnQmSxFOYv49DF2l14DpBBiy6K02laKHzNDP9EKDYPbed3u5ZJG/4iRDUx4
awzxA9lc7wKBgH7Sa3PKw4Li1OBjvM1dRcP2YuUTbQWNQghKsjUF6iBncFSPyca6
+fz5+poeNifhsxVQPMFHIvJimCtytvM/ZhbpE4GcSdf6iPwEgnZHzRXN3YQkpSpj
Yl9/GVftL2GuHitElE+Hdwt2xo1804fIoTBxrkbf5uJFpqbce4ta0i+BAn9smc7A
ruKYEoa5u8oQ4lL+10al9LUuA2nvApbHAUrCXZ33zXa6ffyAzdNY/f8KqlwkPTZd
RCufQSZy8hwukr5LRm4P9/U2+5nWUISAIt4T80uRewDhQNkGJ2PKi14pHgVSDqvq
tKiHEV/79zIVZqiAQXV0QkxKwsXdMwGtCF5xAoGAORhch5++D3g0u9I+NkWDRiCG
akle2d2Jm5phYqtp94Xosq5B7KqDPolf6D03M63I2ex7WL6pmUoDe9QtL+DNhPGK
TwfmbrI/+GafE5tBVLGNaESE7PK9obsAPP/5LNY67/m9j1MCOZz2dMoK5ZhfSxac
3SJvO0IJsY6EUu12+lA=
-----END PRIVATE KEY-----

server.crt

-----BEGIN CERTIFICATE-----
MIID6TCCAtGgAwIBAgIUD6Lzk5QQhB2Ef2fRm9fPVlKJnx0wDQYJKoZIhvcNAQEL
BQAwgYMxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJBQTEUMBIGA1UEBwwLUmFpbmJv
d0NpdHkxEDAOBgNVBAoMB0ZpYWdvcmExDTALBgNVBAsMBHVuaXQxFDASBgNVBAMM
C2V4YW1wbGUuY29tMRowGAYJKoZIhvcNAQkBFgtlQGVtYWlsLmNvbTAeFw0xOTA0
MjQxMzEwMzFaFw0yMDA0MjMxMzEwMzFaMIGDMQswCQYDVQQGEwJVUzELMAkGA1UE
CAwCQUExFDASBgNVBAcMC1JhaW5ib3dDaXR5MRAwDgYDVQQKDAdGaWFnb3JhMQ0w
CwYDVQQLDAR1bml0MRQwEgYDVQQDDAtleGFtcGxlLmNvbTEaMBgGCSqGSIb3DQEJ
ARYLZUBlbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDI
itybmMnZDEgnlX/gcgqLy7sp+55b3XkSwQgCZ5wFeJaMl/gyz2FkEF8TDdsOdgHl
tPCSqOCH7HW2+HRqiHSSQyySQvPEev9RUMe0xLBV0PFcUeklARRamN8Fwpg4m8S2
Vrm/jjsQtOiTkVTO6TkEiZ4Zx27roEHKtM/gp40G7IHjOvYtzEoqRoXPy+w2Ytl3
ovwLR72UbolcFDyxeWPZUlU4rG2LWtB44rHq3/+pYk2HzViJX0sjpeJO31vz93ep
a2BCJRBf/IKKz2sQPzkiWTHSBZrtXIZ3hxPVErRq+DQozuFG0fXcPRoKeUqQjsB1
wIEKtVurjsJaBm0XH5F/AgMBAAGjUzBRMB0GA1UdDgQWBBQAnYqkkWUVt4+Xfm93
NEQ4KpuX7DAfBgNVHSMEGDAWgBQAnYqkkWUVt4+Xfm93NEQ4KpuX7DAPBgNVHRMB
Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCRtZmMily3a3JcrXtLcgs147nR
3K60K1s/IGFEz15SZIziQwPsmgV2T/Vf2eD84GzEceteKZOcN1VCSTuHjfS/8JE7
C94fqKJ0C2mq8SvwMa788vezXlTn8+EiLNjAYf0JArh8zZdXQGg/5bOZtytknhAV
hxWaRwbs5raMP3gsZviJ8wzWrMBgmc7lERX7riUO7gMh5Ga9w4QaclHLnvzBMeQq
q45cwzwekG5jiM4bQdMw3FSd8MD9tDJ5V3V2m+d1jNoozIbTC0l5pe/HYKDPg24A
ypruHpek5iRKAImwEzL4fpbqdsA6s9FNFxxI7MamJTom4vT0LzZgw5hJldoq
-----END CERTIFICATE-----

Дополнительная информация :

  • Я пробовал это на нескольких браузерах: Chrome, Firefox, IE, Vivaldi, Brave
  • Не удалось успешно импортировать client.crt & server.crt в коллекцию сертификатов браузера («Персональные»): сертификаты не отображаются, даже если я получаю сообщение «Импорт успешно выполнен».

Вопрос

С учетом приведенной выше информации, когда я пытаюсь подключиться с помощью любого браузера к моему сеансу 127.0.0.1:8082, я получаю сообщение об отклонении сертификата Как заставить браузер запрашивать файл сертификата клиента, чтобы рукопожатие могло быть успешным? В случае успеха экземпляр сервера должен ответить аутентифицированному клиенту с простой страницей.

Будем весьма благодарны за любую помощь в том, как добиться аутентификации SSL-рукопожатия между клиентом и сервером!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...