web-dev-qa-db-ja.com

サーバー名表示(SNI)の実装方法

CまたはC++でOpenSSLにサーバー名表示(SNI)を実装する方法

実例はありますか?

38
2.8a8a_G

クライアント側では、SSL接続を開始する前にSSL_set_tlsext_Host_name(ssl, servername)を使用します。

サーバー側では、少し複雑です。

  • 異なる証明書ごとに追加のSSL_CTX()をセットアップします。
  • SSL_CTX()を使用して、各SSL_CTX_set_tlsext_servername_callback()にservernameコールバックを追加します。
  • コールバックで、SSL_get_servername(ssl, TLSEXT_NAMETYPE_Host_name)を使用してクライアントが提供するサーバー名を取得します。そのホスト名に対応する正しい_SSL_CTX_を見つけ出し、SSLオブジェクトをSSL_set_SSL_CTX()でその_SSL_CTX_に切り替えます。

OpenSSLソースディストリビューションの_s_client.c_ディレクトリにある_s_server.c_および_apps/_ファイルはこの機能を実装しているため、どのように実行するかを確認するための優れたリソースです。

62
caf