Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen

Ich habe es gemacht, um fehlerhafte HTTP-Header, grammatikalisch NG HTML oder grammatisch NG JavaScript an die andere Partei zurückzusenden, wenn ich den Betrieb des HTTPS-Clients überprüfe.

Die Umgebung ist wie folgt.

Zertifikat bezogen

Ich werde es mit openssl tun.

Wenn ich es nur SSL wollte, wird die Methode unten beschrieben (ich habe sie als Referenz verwendet. Danke)

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

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

Wenn Sie beispielsweise den Schlüssel mock.key und das Zertifikat mock.crt benennen möchten: Die Domain ist super geeignet (weil ich sie nicht benutze ...)

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

Wenn Sie später Python schreiben, können Sie SSL verwenden.

Python-Code

Ich habe es basierend auf dem Code im folgenden Artikel geschrieben (ich habe es als Referenz verwendet. Danke)

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

Die offizielle Dokumentation finden Sie weiter unten.

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

Und das ist der Code, den ich geschrieben habe.


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

import socket
import ssl
import sys

'''
Bitte zögern Sie nicht, uns je nach Umgebung zu kontaktieren.
'''
TEST_IP = '10.0.0.12'
TEST_PORT = 443
TEST_KEY = "mock.key"
TEST_CERT = "mock.crt"


class TestSSLServer:

    '''
Ich habe versucht, das grundlegende Betriebssystem des SSL-Servers grob zusammenzufassen
    '''

    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)  #Angemessen

    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 gibt diesen Fehler aus
Zur Vorbereitung der Verbindung zur Annahme zurückkehren
                '''
                print("wrap: SSL error:", sys.exc_info()[0])
                continue
            except OSError:
                '''
Das Safari-System gibt diesen Fehler aus
Zur Vorbereitung der Verbindung zur Annahme zurückkehren
                '''
                print("wrap: OS error:", sys.exc_info()[0])
                continue
            except BaseException:
                '''
Ich weiß nichts anderes, also gehe ich davon aus, dass der Prozess nicht mit w (STRG) beendet wurde-C sollte hierher kommen)
                '''
                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__':

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

    '''
Auf Verbindung warten
    '''
    server.accept_socket()

    '''
Anfrage und Antwort einmal
    '''
    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())

    '''
Trennen, Ressourcen freigeben
    '''
    server.finsih_socket()

Der ursprüngliche Code war Python2, aber ich versuche, ihn mit 3 zum Laufen zu bringen. Außerdem wird SO_REUSEADDR unter Berücksichtigung des Falls festgelegt, wenn es in der Mitte gestoppt wird.

Danach wird das Verhalten zum Zeitpunkt des Fehlers so geändert, dass es auch dann in Ordnung ist, wenn über den Browser darauf zugegriffen wird. Insbesondere wenn die Authentifizierung aufgrund von mir fehlschlägt, wird ssl.SSLError oder OSError angezeigt. Beginnen Sie in diesem Fall einfach von vorne mit w

Wie Sie dem Code entnehmen können, müssen Sie alle Header und Body selbst schreiben. Mit anderen Worten, Sie können auf Ihre Lieblingsdaten zurückblicken, ohne sich um die Grammatik kümmern zu müssen.

Ausführungsmethode

Für die Ausführungsmethode war es bei Verwendung von Port 443 erforderlich, unter Ubuntu zu sudo. Etwas wie das.

sudo python3.7 sample_server.py

Der Rest kommt aus dem Browser

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

Sie können so darauf zugreifen. Wenn TEST_PORT auf 443 gesetzt ist, ist: nnnn nicht erforderlich. Ich bin sicher, Sie werden für das Zertifikat beschimpft, aber wenn Sie es wissen und es im Verbindungsfluss tun, sollten Sie einen Test erhalten.

Recommended Posts

Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
ODBC-Zugriff auf SQL Server von Linux mit Python
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
Es fiel mir schwer, über einen Browser (und ArchLinux) auf Hadoop3.0.0 zuzugreifen.
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe mit Razpai einen Webserver erstellt, um Anime zu schauen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe einen Chat-Chat-Bot mit Tensor2Tensor erstellt und diesmal hat es funktioniert
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe mit Python eine Hex-Map erstellt
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Ich habe versucht, mit django eine E-Mail zum Abschluss der Registrierung von Google Mail zu senden.
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen