2013-04-26 6 views
5

Ich versuche, einen Web-Server in Delphi XE3 mit Indy und OpenSSL einzurichten, der Verkehr über HTTP- und HTTPS-Verbindungen am selben Port bedienen kann.Wie kann ich SSL- und Nicht-SSL-Datenverkehr auf demselben Port mit TIdTCPServer und OpenSSL in Delphi XE3 unterstützen?

Ich habe zwei Hauptansätze gesehen, und keiner scheint für mich zu funktionieren.

Zuerst: Vorne TLS/SSL. Dies beinhaltet das Lesen der ersten paar Bytes des Streams, um nach dem "Client-Hello" -Teil des nicht sicheren Handshakes zu suchen und (falls gefunden) die Server-SSL-Handshake-Antwort aufzurufen, aber wenn ich das tue, erkennt die OpenSSL-Bibliothek das nicht der Handshake, weil ich die führenden Bytes der Nachricht entfernt habe.

Zweitens: TLS nach STARTTLS (oder gleichwertig). Dies beinhaltet das Senden eines speziellen Zeichensatzes (STARTTLS), auf den sofort "Client-Hello" folgt. Der Server lässt dann die gesamte SSL-Handshake-Nachricht intakt, um sie an die OpenSSL-Bibliothek zu übergeben. Das Problem bei diesem Ansatz besteht darin, dass die meisten Webbrowser dies nicht unterstützen (RFC 2817).

Für eine Zusammenfassung der beiden Ansätze, schau mal hier: What happens on the wire when a TLS/LDAP or TLS/HTTP connection is set up?)

Wie kann ich SSL und nicht-SSL-Datenverkehr auf dem gleichen Port mit TIdHTTPServer und OpenSSL in Delphi XE3 unterstützen?

Antwort

1

Was Sie fragen, ist nicht möglich mit Indy out of the box. Seine Standard-SSL-Implementierung verwendet die traditionelle API von OpenSSL, wo sie alle ihre eigenen Socket-I/O-Operationen ausführt. Daher benötigt sie direkten Zugriff auf die vollständigen Handshake-Daten, ohne dass Sie zuerst die Daten ansehen müssen. Aber alles ist nicht verloren. Sie haben mehrere Möglichkeiten:

1) Verwenden Sie libpcap/Winpcap zum Erfassen und Betrachten der ersten paar Bytes von Rohdaten, die aus dem Draht für neue Verbindungen kommen, bevor der Socket es für Ihre Anwendung bereitstellt.

2) Schreiben Sie Ihre eigene abgeleitete Klasse TIdIOHandler, die die neuere BIO API von OpenSSL oder die SChannel API von Microsoft verwendet, so dass Sie die Socket-E/A kontrollieren und eingehende Bytes selbst lesen können, bevor Sie sie in die Verschlüsselungsmodul für die Verarbeitung.

+0

Danke für die alternativen Vorschläge! Ich werde in diese schauen und wenn ich am Ende eines von denen implementiere, werde ich hier wieder posten. – Andy

2

Ich würde nicht erwarten, dass dies mit Internet Direct (Indy) so einfach zu implementieren ist - der Apache HTTP-Server kann es nicht, und dies bedeutet entweder a) fast niemand wollte jemals diese Funktion b) es ist nicht so einfach zu implementieren oder vielleicht c) könnte es Sicherheitsrisiken einführen.

Von der akzeptierten Antwort auf https://serverfault.com/questions/359461/apache-answer-both-http-and-https-on-the-same-port

mit Apache Dieser wird nicht möglich sein. Mit Apache können Sie nicht haben HTTPS und HTTP auf dem gleichen Port laufen.

Ich kenne einige Port-Multiplexer, die HTTPS/OpenVPN oder SSH auf dem gleichen Port laufen lassen, aber diese erfordern zusätzliche Software. I sind mir keine Tools bekannt, die HTTPS und HTTP multiplexen.