получить SNI от клиента ssl в C [duplicate]

Это может или не может помочь кому-либо, но у меня была страница, на которой я не мог нормально попасть, независимо от того, какие трюки Css я пробовал, поэтому я написал JQuery-файл. Страница Center:

с уровнем масштабирования браузера, страница будет сдвигаться, если вы были на 100%, 125%, 150% и т. д.

Код ниже находится в файле JQuery с именем centerpage.js.

На моей странице мне пришлось ссылаться на JQuery и этот файл, чтобы он работал, хотя моя главная страница уже имела ссылку на JQuery.

<title>Home Page.</title>
<script src="Scripts/jquery-1.7.1.min.js"></script>
<script src="Scripts/centerpage.js"></script>

centerpage.js:

// centering page element
function centerPage() {
    // get body element
    var body = document.body;

    // if the body element exists
    if (body != null) {
        // get the clientWidth
        var clientWidth = body.clientWidth;

        // request data for centering
        var windowWidth = document.documentElement.clientWidth;
        var left = (windowWidth - bodyWidth) / 2;

        // this is a hack, but it works for me a better method is to determine the 
        // scale but for now it works for my needs
        if (left > 84) {
            // the zoom level is most likely around 150 or higher
            $('#MainBody').removeClass('body').addClass('body150');
        } else if (left < 100) {
            // the zoom level is most likely around 110 - 140
            $('#MainBody').removeClass('body').addClass('body125');
        }
    }
}


// CONTROLLING EVENTS IN jQuery
$(document).ready(function() {
    // center the page
    centerPage();
});

Также, если вы хотите центрировать панель:

// centering panel
function centerPanel($panelControl) {
    // if the panel control exists
    if ($panelControl && $panelControl.length) {
        // request data for centering
        var windowWidth = document.documentElement.clientWidth;
        var windowHeight = document.documentElement.clientHeight;
        var panelHeight = $panelControl.height();
        var panelWidth = $panelControl.width();

        // centering
        $panelControl.css({
            'position': 'absolute',
            'top': (windowHeight - panelHeight) / 2,
            'left': (windowWidth - panelWidth) / 2
        });

        // only need force for IE6
        $('#backgroundPanel').css('height', windowHeight);
    }
}
35
задан jww 29 December 2014 в 04:48
поделиться

1 ответ

На стороне клиента вы используете SSL_set_tlsext_host_name(ssl, servername) перед началом соединения SSL.

На стороне сервера это немного сложнее:

  • Настроить SSL_CTX() для каждого другого сертификата;
  • Добавить обратный вызов имени сервера к каждому SSL_CTX() с помощью SSL_CTX_set_tlsext_servername_callback();
  • В обратном вызове получить имя сервера, предоставленное клиентом, с помощью SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name). Выделите правую SSL_CTX, чтобы перейти с этим именем хоста, затем переключите объект SSL на это SSL_CTX с SSL_set_SSL_CTX().

s_client.c и s_server.c файлы в каталоге apps/ исходного дистрибутива OpenSSL реализуют эту функцию, поэтому они являются хорошим ресурсом, чтобы увидеть, как это должно быть сделано.

52
ответ дан caf 22 August 2018 в 14:14
поделиться
  • 1
    Хорошие примеры - s_client.c и s_server.c. Я пытаюсь реализовать SNI на клиенте, который действует как генератор нагрузки (сеть) и забивает сервер с запросами http / https. И сервер уже имеет серверный SNI. – 2.8a8a_G 28 February 2011 в 08:09
  • 2
    Задерживаются ли вызовы сервера в многопоточном контексте? Похоже, что SSL_set_SSL_CTX врожденно не является потокобезопасным (т. Е. Если у вас есть два разных входящих соединения с двумя разными сертификатами, у вас возникнет проблема). – chacham15 11 May 2014 в 19:57
  • 3
    @ chacham15: Один из способов сделать его потокобезопасным - выделить один SSL_CTX() на каждый сертификат для каждого потока (и всегда обрабатывать те же объекты SSL и SSL_CTX из того же потока). Другой способ - установить обратные вызовы потоков с CRYPTO_set_id_callback() и CRYPTO_set_locking_callback(), и в этом случае OpenSSL сделает правильные вызовы для обратного вызова блокировки, чтобы сделать SSL_set_SSL_CTX() потокобезопасным. – caf 17 May 2014 в 08:42
  • 4
    Это очень хорошая запись на высоком уровне, спасибо! jww проиллюстрировал именно этот подход с примером кода в другом ответе . Мог ли один или оба из вас, пожалуйста, увеличить эти ответы с вопросом, поднятым в комментариях относительно нескольких потоков? Например, как SSL_set_SSL_CTX врожденно не защищен потоком? Похоже, что это влияет только на SSL-соединение, указанное в первом аргументе. – mat 25 July 2016 в 14:43
  • 5
    Вы знаете, как я могу реализовать поддержку SNI на сервере, используя boost :: asio как сокет? Я не могу найти никакого примера. Я также не вижу, как я могу добавить несколько ssl-контекстов, поскольку ssl-сокет принимает контекст в конструкторе – Ben D 27 September 2017 в 12:06
Другие вопросы по тегам:

Похожие вопросы: