Wie implementiert man Server Name Indication (SNI) auf OpenSSL in C oder C++?
Gibt es Beispiele aus der Praxis?
2.8a8a_G
Wie implementiert man Server Name Indication (SNI) auf OpenSSL in C oder C++?
Gibt es Beispiele aus der Praxis?
Auf der Client-Seite verwenden Sie SSL_set_tlsext_host_name(ssl, servername)
bevor Sie die SSL-Verbindung initiieren.
Auf der Serverseite ist es etwas komplizierter:
SSL_CTX()
für jedes andere Zertifikat;SSL_CTX()
verwenden SSL_CTX_set_tlsext_servername_callback()
;SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)
. Finden Sie das Richtige heraus SSL_CTX
mit diesem Hostnamen gehen, dann wechseln Sie die SSL
dem widersprechen SSL_CTX
mit SSL_set_SSL_CTX()
.Das s_client.c
und s_server.c
Dateien in der apps/
Verzeichnis der OpenSSL-Quelldistribution implementieren diese Funktionalität, daher sind sie eine gute Ressource, um zu sehen, wie es gemacht werden sollte.
s_client.c und s_server.c sind gute Beispiele. Ich versuche, SNI auf einem Client zu implementieren, der als Lastgenerator (Netzwerk) fungiert und einen Server mit http/https-Anfragen hämmert. Und der Server hat bereits serverseitiges SNI implementiert.
– 2.8a8a_G
28. Februar 2011 um 7:09 Uhr
Halten die Serveraufrufe in einem Multithread-Kontext? Es scheint, als wäre SSL_set_SSL_CTX von Haus aus nicht threadsicher (dh wenn Sie zwei verschiedene eingehende Verbindungen mit zwei verschiedenen Zertifikaten haben, haben Sie ein Problem).
– chacham15
11. Mai 2014 um 18:57 Uhr
@chacham15: Eine Möglichkeit, es Thread-sicher zu machen, besteht darin, einen zuzuweisen SSL_CTX()
pro Zertifikat, pro Thread (und immer gleich behandeln SSL
und SSL_CTX
Objekte aus demselben Thread). Die andere Möglichkeit besteht darin, Thread-Callbacks mit zu setzen CRYPTO_set_id_callback()
und CRYPTO_set_locking_callback()
in diesem Fall führt OpenSSL die richtigen Aufrufe für den Sperrrückruf durch SSL_set_SSL_CTX()
Thread-sicher.
– Café
17. Mai 2014 um 7:42 Uhr
Das ist ein sehr schöner High-Level-Schreiben, danke! jww hat genau diesen Ansatz mit einem Codebeispiel in einer anderen Antwort veranschaulicht. Könnte einer oder beide von Ihnen diese Antworten bitte um das in den Kommentaren zu mehreren Threads angesprochene Problem ergänzen? Wie ist zum Beispiel SSL_set_SSL_CTX
von Haus aus nicht threadsicher? Es scheint nur die im ersten Argument angegebene SSL-Verbindung zu betreffen.
– Matte
25. Juli 2016 um 14:43 Uhr
Wissen Sie, wie ich SNI-Unterstützung auf einem Server mit boost::asio als Socket implementieren kann? Ich kann kein Beispiel finden. Ich sehe auch nicht, wie ich mehrere SSL-Kontext hinzufügen kann, da der SSL-Socket den Kontext im Konstruktor übernimmt
– Biege
27. September 2017 um 12:06 Uhr
Siehe auch Serving multiple domains in a box with SNI für einige Codebeispiele und deren Verwendung
s_client
um Ihren Server zu testen.– jww
13. März 2014 um 15:48 Uhr