Ich kann keine HTTPS-Verbindung zum Programm herstellenPython

Python-Programme
Guest
 Ich kann keine HTTPS-Verbindung zum Programm herstellen

Post by Guest »

Es gibt ein Programm, das XML-Dateien mit den Ergebnissen von Wettbewerben generiert. Ich komme nicht in den Code dieses Programms. Das Programm verfügt über die Möglichkeit, Daten über HTTP-Post-Requests auszugeben. Ich habe einen Tornado-Python-Minim-Server geschrieben, um diese Daten zu empfangen. Ich habe es mit einer regulären HTTP-Verbindung herausgefunden und konnte eine Verbindung herstellen und Daten empfangen, aber mit HTTPS geht das nicht. Es stellt sich heraus, dass das Programm bei einem normalen HTTP als HTTP-Client fungiert und Daten an den Server sendet. Zuerst habe ich eine Optionsanfrage gesendet und nach der Antwort des Servers wird eine Verbindung hergestellt und Post-Anfragen werden gesendet. Aber im Fall von HTTPS weiß ich nicht, was passiert. Das einfache Hinzufügen eines TSL-Wrappers funktioniert nicht. Denn nach einem erfolgreichen Handshake wird die Verbindung zum Server sofort unterbrochen. Nach dem Verbindungsabbruch versucht das Programm, eine Verbindung von einem anderen Port herzustellen. Und so wie ich es verstehe, hat selbst die erste Optionsanfrage keine Zeit zum Senden. Die Programmoberfläche enthält keine Verbindungsdaten außer der Aktivierung und Deaktivierung des HTTPS-Modus
Wenn die Verbindung erfolgreich ist, sieht die Anwendung so aus
Es gibt keine Dokumentation dafür das Programm. :D
HTTP-Verbindung
So sieht mein Code für eine erfolgreiche HTTP-Verbindung aus< /p>

Code: Select all

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):

def log_request(self):
print("----- HTTP Request -----")
print(f"Method: {self.request.method}")
print(f"URI: {self.request.uri}")
print(f"Headers: \n{self.request.headers}")
if self.request.body:
print(f"Body: {self.request.body.decode('utf-8')}")
print(f"protocol: {self.request.protocol}")
print("------------------------")
print(f"Request: {self.request}")
print("------------------------")

def post(self):
self.log_request()
if len(self.request.body) >  MAX_MESSAGE_SIZE:
self.set_status(413)
self.write("Payload Too Large")
return
data = self.request.body.decode("utf-8")
print(f"Received POST data: {data}")

self.set_status(200)
self.write("POST data received")

def get(self):
self.set_status(201)

def options(self):
self.log_request()
self.set_status(200)
self.set_header("Cache-Control","no-cache")
self.set_header("X-HOVTP-Environment","Test")
self.set_header("X-HOVTP-Last-Serial-Number","12345")
self.set_header("X-HOVTP-Keep-Alive-Interval","20")

class sMainHandler(tornado.web.RequestHandler):

def log_request(self):
print("----- HTTP Request -----")
print(f"Method: {self.request.method}")
print(f"URI: {self.request.uri}")
print(f"Headers: \n{self.request.headers}")
if self.request.body:
print(f"Body: {self.request.body.decode('utf-8')}")
print(f"protocol: {self.request.protocol}")
print("------------------------")
print(f"Request: {self.request}")
print("------------------------")

def options(self):
self.log_request()
self.set_status(200)
self.set_header("Cache-Control", "no-store, no-cache")
self.set_header("Connection", "keep-alive")

def make_app():
return tornado.web.Application([
(r"/HOVTP/", MainHandler),
#(r".*", sMainHandler),
])

if __name__ == "__main__":
app = make_app()
app.listen(443)
print("Server is running on http://localhost:8888")
tornado.ioloop.IOLoop.current().start()

Und jetzt die HTTPS-Verbindung
Hier ist mein aktuell am besten funktionierender Code für die Verbindung

Code: Select all

import tornado.ioloop
import tornado.web
from tornado import http1connection
from tornado.tcpserver import TCPServer
from tornado.iostream import StreamClosedError
import socket, ssl
import logging
import asyncio
import functools

def get_ssl_context():
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.verify_mode = ssl.VerifyMode.CERT_NONE
ssl_context.load_cert_chain("cert/certificate.crt", "cert/privateKey.key")
ssl_context.keylog_filename = "keys.txt"
ssl_context.options |= ssl.OP_NO_COMPRESSION
ssl_context.options |= ssl.OP_NO_TICKET
ssl_context.options |= ssl.OP_ENABLE_MIDDLEBOX_COMPAT
ssl_context.options |= ssl.OP_SINGLE_ECDH_USE
return ssl_context

class EchoServer(TCPServer):
async def handle_stream(self, stream, address):
while True:
try:
data = await stream.read_until(b"\n")
await stream.write(data)
except StreamClosedError:
print(stream.closed(), address)
break

if __name__ == "__main__":
try:
async def main():
server = EchoServer(get_ssl_context())
server.listen(443)
await asyncio.Event().wait()
asyncio.run(main())
except ssl.SSLError:
print(ssl.SSLError)
Und hier ist die Wireshark-Ausgabe

Code: Select all

No.     Time           Source                Destination           Protocol Length Info
25 2.696257       127.0.0.1             127.0.0.1             TCP      56     52908 → 443 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM

Frame 25: 56 bytes on wire (448 bits), 56 bytes captured (448 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 52908, Dst Port: 443, Seq: 0, Len: 0

No.      Time           Source                Destination           Protocol Length Info
26 2.696292       127.0.0.1             127.0.0.1             TCP      56     443 → 52908 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM

Frame 26: 56 bytes on wire (448 bits), 56 bytes captured (448 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443, Dst Port: 52908, Seq: 0, Ack: 1, Len: 0

No.     Time           Source                Destination           Protocol Length Info
27 2.696315       127.0.0.1             127.0.0.1             TCP      44     52908 → 443 [ACK] Seq=1 Ack=1 Win=2161152 Len=0

Frame 27: 44 bytes on wire (352 bits), 44 bytes captured (352 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 52908, Dst Port: 443, Seq: 1, Ack: 1, Len: 0

No.     Time           Source                Destination           Protocol Length Info
28 2.696401       127.0.0.1             127.0.0.1             HTTP     302    OPTIONS /HOVTP/ HTTP/1.1

Frame 28: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 52908, Dst Port: 443, Seq: 1, Ack: 1, Len: 258
Hypertext Transfer Protocol

No.     Time           Source                Destination           Protocol Length Info
30 2.696418       127.0.0.1             127.0.0.1             TCP      44     443 → 52908 [ACK] Seq=1 Ack=259 Win=2160896 Len=0

Frame 30: 44 bytes on wire (352 bits), 44 bytes captured (352 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443, Dst Port: 52908, Seq: 1, Ack: 259, Len: 0

No.     Time           Source                Destination           Protocol Length Info
36 2.698030       127.0.0.1             127.0.0.1             HTTP     308    HTTP/1.1 200 OK

Frame 36: 308 bytes on wire (2464 bits), 308 bytes captured (2464 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443, Dst Port: 52908, Seq: 1, Ack: 259, Len: 264
Hypertext Transfer Protocol

No.     Time           Source                Destination           Protocol Length Info
37 2.698047       127.0.0.1             127.0.0.1             TCP      44     52908 → 443 [ACK] Seq=259 Ack=265 Win=2160896 Len=0

Frame 37: 44 bytes on wire (352 bits), 44 bytes captured (352 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 52908, Dst Port: 443, Seq: 259, Ack: 265, Len: 0

No.     Time           Source                Destination           Protocol Length Info
62 7.711112       127.0.0.1             127.0.0.1             HTTP     302    OPTIONS /HOVTP/ HTTP/1.1

Frame 62: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 52908, Dst Port: 443, Seq: 259, Ack: 265, Len: 258
Hypertext Transfer Protocol

No.     Time           Source                Destination           Protocol Length Info
63 7.711134       127.0.0.1             127.0.0.1             TCP      44     443 → 52908 [ACK] Seq=265 Ack=517 Win=2160640 Len=0

Frame 63: 44 bytes on wire (352 bits), 44 bytes captured (352 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443, Dst Port: 52908, Seq: 265, Ack: 517, Len: 0

No.     Time           Source                Destination           Protocol Length Info
66 7.712553       127.0.0.1             127.0.0.1             HTTP     308    HTTP/1.1 200 OK

Frame 66: 308 bytes on wire (2464 bits), 308 bytes captured (2464 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443, Dst Port: 52908, Seq: 265, Ack: 517, Len: 264
Hypertext Transfer Protocol

No.      Time           Source                Destination           Protocol Length Info
67 7.712590       127.0.0.1             127.0.0.1             TCP      44     52908 → 443 [ACK] Seq=517 Ack=529 Win=2160640 Len=0

Frame 67: 44 bytes on wire (352 bits), 44 bytes captured (352 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 52908, Dst Port: 443, Seq: 517, Ack: 529, Len: 0

Ich habe auch versucht, einen solchen Server zu bauen

Code: Select all

async def handle_connection(connection, address):
io_loop = tornado.ioloop.IOLoop.current()
print(f"Connect from {address[0]}:{address[1]}")
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain("cert/certificate.crt", "cert/privateKey.key")
ssl_context.keylog_filename = "keys.txt"
ssl_context.options |= ssl.OP_NO_COMPRESSION
ssl_context.options |= ssl.OP_NO_TICKET
stream = tornado.iostream.IOStream(connection)
stream.set_nodelay(True)
stream = await stream.start_tls(True,ssl_context)
stream = await stream.wait_for_handshake()
print(stream.socket.session, stream.socket.session.id)
sessionList.append(stream)

def new_con(sock,fd,events):
print("Current connections:")
for i in sessionList:
print(i, i.closed())
while True:
try:
conn, fromaddr = sock.accept()
except BlockingIOError:
print("Close connection")
return
io_loop = tornado.ioloop.IOLoop.current()
io_loop.spawn_callback(handle_connection, conn, fromaddr)

async def main():
print("Listen for connection.")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(0)
sock.bind(("127.0.0.1", 443))
sock.listen(5)
io_loop = tornado.ioloop.IOLoop.current()
callback = functools.partial(new_con, sock)
io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
await asyncio.Event().wait()

if __name__ == "__main__":
try:
asyncio.run(main())
except ssl.SSLError:
print(ssl.SSLError)
Hier ist ein Verbindungsversuch über Wireshark
Hier habe ich 3 Verbindungsversuche gespeichert, um zu zeigen, wie der Server den Port ändert

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post