Ich verwende OpenSSL 1.0.0-fips unter Linux. Das Problem, das ich habe, ist, dass SSL_connect()
-1 zurückgibt und SSL_get_error()
SSL_ERROR_WANT_READ
zurückgibt. Ich legte dann den Dateideskriptor in eine select()
mit einer timeval
Struktur auf 10 Sekunden und die select()
gerade Time out.Nicht blockierende E/A mit OpenSSL BIO
Ich feuerte Wireshark und ich sehe den "Client Hallo" ausgehen und ich sehe die ServerHello
kommen zurück zum Client, aber es "wacht" nie in der select()
. Es läuft einfach ab.
Meine Fragen sind: mit SSL_set_bio()
Muß ich ein BIO-Objekt erstellen
BIO_new_socket()
verwenden und dann das BIO Objekt zu meinem SSL-Objekt zuweisen? Die man-Seite fürSSL_set_fd()
sagt, es wird automatisch ein BIO-Objekt erstellen, so scheint es zu implizieren, dassSSL_set_bio()
ist eine Art von einer nutzlosen Funktion, die Sie nie wirklich anrufen müssen.Angenommen wir verwenden
SSL_set_fd()
und weisen einen verbundenen TCP-Dateideskriptor zu, der blockiert. Nehmen wir an, dass wir später diesen Dateideskriptor unter Verwendung vonfcntl()
zu nicht blockierend ändern. Wird das SSL-Objekt (oder das zugrundeliegende BIO-Objekt) dadurch beschädigt?
Sie sollten wahrscheinlich etwas Code zeigen, einschließlich, wie Sie den Kontext einrichten. Asynchrone E/A- und nicht-blockierende Sockets geben Leuten eine Menge Ärger, weil die Bibliothek nicht zu entgegenkommend ist. Lesen Sie den Quellcode für ['apps/ocsp.c'] (https://github.com/openssl/openssl/blob/master/apps/ocsp.c), um zu sehen, wie OpenSSL es tut. Ich erinnere mich, dass ein normaler Kontext im Blocking-Modus eingerichtet ist, dann wechseln die Dinge mit dem zugrunde liegenden Socket in den nicht-blockierenden Modus. Suchen Sie nach Code, der 'BIO_get_fd' und' select' aufruft. AFAIK, es ist das einzige Beispiel für nicht blockierende E/A im selbst dokumentierenden Code :) – jww
Ich habe den Code nicht veröffentlicht, weil die gesamte Verbindungsfunktion für meine implementierte C++ - SSL-Socket-Klasse ziemlich groß ist. Ich habe jedoch mein Problem gefunden. Ich habe vergessen, 1 zu dem Argument maxfd hinzuzufügen, um() auszuwählen. –