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