2014-07-21 9 views
5

Ich benutze openssl in meiner iOS-Anwendung, und es funktioniert Geldbußen, bis ich eine zu große Nachricht (100kb) vom Server zum Client (iOS App) gesendet habe.Openssl iOS-Pufferlimit

Das Problem ist die ssl_read() -Methode haben eine Grenze Puffergröße wie 16384 Bytes, wenn der Server eine Nachricht senden, die größer als 16384 Bytes ist, wird das Zurücksetzen der Nachricht ignoriert.

Meine Frage ist, wie kann ich dieses Limit ändern (dieses Limit erhöhen)?

+0

Beachten Sie, dass Sie in jedem Fall besser bedient werden können, wenn Sie Apple's APIs anstelle von OpenSSL verwenden; Wenn Sie Letzteres verwenden, müssen Sie es auf dem neuesten Stand halten, und Sie sollten es in Ihrem Anwendungspaket versenden.Für gewöhnliches HTTPS können Sie die meisten Dinge mit Core Foundation und/oder Foundation tun. Sehen Sie sich für komplexere Aufgaben Secure Transport und/oder Common Crypto an. – alastair

Antwort

3

Kurze Antwort:

Sie können nicht die Grenze ändern. Sie müssen einen Teil der Daten lesen, in einem Puffer speichern, einen anderen Teil lesen, an den Puffer anhängen usw., bis Sie die gesamte Nachricht erhalten haben.

Longer Antwort:

Die maximale Datensatzgröße ist 16384 (2^14), weil es auf diese Weise durch den Standard definiert ist. Zum Beispiel für TLS 1.2 ist das rfc5246.

Die Aufzeichnungsschichtfragmente Informationsblöcke in TLSPlaintext
zeichnet Daten in Blöcken von 2^14 Bytes oder weniger tragen. Client
Nachrichtengrenzen sind nicht in der Aufzeichnungsschicht erhalten (d.h.
mehreren Client-Einträge aus demselben Contenttype KANN
in einen einzigen Datensatz TLSPlaintext oder eine einzelne Meldung kann sein
über mehrere Datensätze fragmentiert koalesziert werden).

Die Spezifikation macht es ganz klar, dass die Länge hat eine feste Größe:

Die Länge muss NICHT 2^14 überschreiten.

Ihr Sender sollte keine größeren SSL-Datensätze erstellen. Es sollte die Nachricht über mehrere SSL-Datensätze fragmentieren.

Eine SSL-Aufzeichnung ist analog zu einem IP-Paket. Die maximale Datenmenge, die Sie tatsächlich in ein IP-Paket stecken können, ist etwas kleiner als Ihre MTU, die normalerweise 1500 Bytes beträgt. Wie funktioniert TCP, mit dem Sie Nachrichten mit beliebiger Länge senden können? Nun, es funktioniert, indem Sie Ihre Nachricht in Blöcken von jeweils 1500 Bytes senden, bis Sie Ihre gesamte Nachricht erhalten haben.

Woher weiß TCP, wann Sie Ihre gesamte Nachricht erhalten haben? Es tut es nicht. Es hat keine Ahnung. Deshalb wird TCP als Stream-Protokoll bezeichnet. Es streamt nur Bytes in deine App. Deine App muss wissen, wann sie eine Nachricht erhalten hat. Im Fall von HTTP wissen Sie das, weil der Client einen Header Content-Length sendet, der dem Server mitteilt, wie viele Bytes zu erwarten sind.

Gleiches mit ssl_read. Sie lesen jeweils einen Teil der Daten, bis Ihre App festgestellt hat, dass Sie eine ganze Nachricht gelesen haben. Sie sammeln diese Chunks in einem größeren Puffer, den Ihre Anwendung verwaltet.