So implementieren Sie Server Name Indication (SNI)

Lesezeit: 2 Minuten

Benutzeravatar von 2.8a8a_G
2.8a8a_G

Wie implementiert man Server Name Indication (SNI) auf OpenSSL in C oder C++?

Gibt es Beispiele aus der Praxis?

  • 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

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:

  • Richten Sie eine zusätzliche ein SSL_CTX() für jedes andere Zertifikat;
  • Fügen Sie jedem einen Servernamen-Callback hinzu SSL_CTX() verwenden SSL_CTX_set_tlsext_servername_callback();
  • Rufen Sie im Rückruf den vom Client bereitgestellten Servernamen mit ab 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

1406910cookie-checkSo implementieren Sie Server Name Indication (SNI)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy