J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur

Je l'ai fait dans le but de renvoyer de mauvais en-têtes HTTP, grammaticalement NG HTML ou grammaticalement NG JavaScript à l'autre partie lors de la vérification du fonctionnement du client HTTPS.

L'environnement est le suivant.

Certificat lié

Je vais le faire en utilisant openssl.

Si je voulais juste le SSL, la méthode est décrite ci-dessous (je l'ai utilisée comme référence. Merci)

https://qiita.com/masakielastic/items/05cd6a36bb6fb10fccf6

https://stackoverflow.com/a/41366949/531320

Par exemple, si vous souhaitez nommer la clé mock.key et le certificat mock.crt: Le domaine est super adapté (car je ne l'utilise pas ...)

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout mock.key -out mock.crt -subj "/CN=test.com" -days 3650

Avec cela, si vous écrivez Python plus tard, vous pouvez SSL.

Code Python

Je l'ai écrit en me basant sur le code de l'article suivant (je l'ai utilisé comme référence. Merci)

https://qiita.com/butada/items/9450e39d8d4aac6ac1fe

La documentation officielle est ci-dessous.

https://docs.python.org/3/library/ssl.html

Et c'est le code que j'ai écrit.


#!/usr/bin/env python
# coding: utf-8

import socket
import ssl
import sys

'''
N'hésitez pas à nous contacter en fonction de l'environnement.
'''
TEST_IP = '10.0.0.12'
TEST_PORT = 443
TEST_KEY = "mock.key"
TEST_CERT = "mock.crt"


class TestSSLServer:

    '''
J'ai essayé de résumer approximativement le système d'exploitation de base du serveur SSL
    '''

    def init_soccket(self, key, cert, ip, port):
        self.ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
        self.ssl_context.load_cert_chain(certfile=cert, keyfile=key)

        self.bind_socket = socket.socket()
        self.bind_socket.setsockopt(
            socket.SOL_SOCKET,
            socket.SO_REUSEADDR,
            1)
        self.bind_socket.setsockopt(
            socket.SOL_SOCKET,
            socket.SO_REUSEPORT,
            1)
        self.bind_socket.bind((ip, port))
        self.bind_socket.listen(5)  #Approprié

    def finsih_socket(self):
        self.connection_stream.shutdown(socket.SHUT_RDWR)
        self.connection_stream.close()

    def accept_socket(self):
        while True:
            try:
                self.accept_socket, _fromaddr = self.bind_socket.accept()
                self.connection_stream = self.ssl_context.wrap_socket(
                    self.accept_socket, server_side=True)
                return
            except ssl.SSLError:
                '''
                Chrome,Firefox donne cette erreur
Retourner pour accepter en vue de la connexion
                '''
                print("wrap: SSL error:", sys.exc_info()[0])
                continue
            except OSError:
                '''
Le système Safari donne cette erreur
Retourner pour accepter en vue de la connexion
                '''
                print("wrap: OS error:", sys.exc_info()[0])
                continue
            except BaseException:
                '''
Je ne sais rien d'autre, donc je suppose que le processus ne s'est pas terminé w (CTRL-C devrait venir ici)
                '''
                print(
                    "wrap: Unexpected error:",
                    sys.exc_info()[0])
                sys.exit(1) 

    def read_stream(self):
        bin_data = self.connection_stream.read()
        return bin_data

    def write_stream(self, bin_data):
        self.connection_stream.sendall(bin_data)


if __name__ == '__main__':

    '''
Initialisation
    '''
    server = TestSSLServer()
    server.init_soccket(TEST_KEY, TEST_CERT, TEST_IP, TEST_PORT)

    '''
Attente de la connexion
    '''
    server.accept_socket()

    '''
Demande et réponse une fois
    '''
    bin_data = server.read_stream()
    if bin_data:
        print (bin_data)
        content = "<html>test</html>"
        text = "HTTP/1.1 200 OK\r\n"
        text += "Content-Length: " + str(len(content)) + "\r\n\r\n"
        text += content
        server.write_stream(text.encode())

    '''
Déconnecter, libérer des ressources
    '''
    server.finsih_socket()

Le code original était Python2, mais j'essaie de le faire fonctionner avec 3. De plus, SO_REUSEADDR est défini en tenant compte du cas où il est arrêté au milieu.

Plus tard, le comportement au moment de l'erreur est modifié de sorte qu'il est OK même s'il est accédé à partir du navigateur. Plus précisément, si l'authentification échoue à cause de moi, ssl.SSLError ou OSError sera affiché, donc dans ce cas, recommencez simplement à partir d'accepter w

Comme vous pouvez le voir dans le code, vous devez écrire vous-même tous les en-têtes et tous les corps. En d'autres termes, vous pouvez consulter vos données préférées sans vous soucier de la grammaire.

Méthode d'exécution

Quant à la méthode d'exécution, lors de l'utilisation du port 443, il était nécessaire de sudo sur Ubuntu. Quelque chose comme ça.

sudo python3.7 sample_server.py

Le reste vient du navigateur

https://xxx.xxxx.xxxx.xxx:nnnn 

Vous devez juste y accéder comme ça. Si TEST_PORT est défini sur 443,: nnnn n'est pas nécessaire. Je suis sûr que vous serez grondé pour le certificat, mais si vous le connaissez et le faites dans le flux de la connexion, vous devriez passer un test.

Recommended Posts

J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé de faire LINE BOT avec Python et Heroku
Accès ODBC à SQL Server depuis Linux avec Python
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
J'ai eu du mal à essayer d'accéder à Hadoop3.0.0 depuis un navigateur (et ArchLinux)
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Je vous ai fait exécuter des commandes depuis un navigateur WEB
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé un serveur Web avec Razpai pour regarder des anime
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
J'ai fait un compteur de caractères avec Python
J'ai essayé un langage fonctionnel avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Utilisez Python de Java avec Jython. J'étais aussi accro.
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé d'envoyer un e-mail de fin d'inscription depuis Gmail avec django.
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python