Як веб-сервер знає, яку пару ключів використовувати для розшифрування SSL?


18

Як я розумію, коли Apache отримає запит до одного з портів TCP, який він прослуховує (наприклад, 80, 443), він вирішить, який хост запитується, переглянувши заголовок HTTP Host. Потім сервер дізнається, на який віртуальний хост він повинен перенаправити запит.

Але як це працює для HTTP через SSL / TLS? Оскільки весь запит HTTP шифрується (принаймні, це я вважаю, що я десь прочитав), інформацію в заголовку можна прочитати лише після того, як сервер розшифрував дані. Але для того, щоб розшифрувати, потрібно знати, яку пару ключів використовувати, оскільки ви можете мати кілька сертифікатів SSL, встановлених на веб-сервері.

То як сервер знає, який ключ потрібен для розшифровки?


Моя здогадка :

Я міг уявити, що рукостискання TLS надає необхідну інформацію.


Щодо прапора "можливий дублікат" :

Хоча я погоджуюся, що відповіді як на пов’язане, так і моє власне, схожі, я мушу сказати, що питання різне. Немає сумніву, чи можливо розміщення кількох сайтів з незалежними SSL-сертифікатами. Натомість моє питання стосується базового технічного аспекту.




Я погоджуюся, що відповіді досить схожі, проте я вважаю, що питання зовсім інші.
paolo

Відповіді:


29

Спочатку веб-сервер не знав. Це було причиною, що вам потрібна окрема IP-адреса для кожного SSL-VHOST, який ви хочете розмістити на сервері. Таким чином, сервер знав, що коли підключення на IP X, йому потрібно використовувати конфігурацію (включаючи сертифікати) для пов'язаного vhost.

Це змінилось із зазначенням імені сервера , розширенням TLS, яке дійсно дозволяє клієнту вказати необхідне ім’я хоста в процесі рукостискання. Це розширення використовується у всіх сучасних ОС, але старі браузери чи сервери не підтримують його, тому, якщо ви очікуєте, що клієнти все ще використовуватимуть IE 6 на WinXP, вам не пощастить.


2
Якщо хтось все ще використовує XP, він все одно не заслуговує на відвідування мого сайту;)
paolo

2
слід дуже обережно ставитись під час обмеження клієнтів (браузери, а не люди). Багато, багато підприємств не дуже добре оновлюють Windows, і те саме стосується деяких постачальників телефонів Android, вони зазвичай не оновлюють свою ОС взагалі (або принаймні не дуже багато). У Windows XP 8%, а частка на ринку Android 4,4 здається величезною.
coteyr

Якщо серверу не вистачає підтримки SNI, можна використовувати проксі з підтримкою SNI перед сервером без підтримки SNI.
kasperd

1
@coteyr Переважна більшість користувачів XP залишаються в Китаї. На щастя, щонайменше, в Інтернеті, в інших місцях використання дуже мало.
Майкл Хемптон

7

Здається, у вас є помилки щодо TLS / SSL. Запит HTTP не шифрується відкритим ключем сервера. Він шифрується симетричним шифром за допомогою ключа, узгодженого в попередньому рукостисканні.

Короткий опис рукостискання TLS: Сервер та клієнт узгоджують деякі шифрсуйти, симетричні ключі (и) та деякі інші деталі. Щоб запобігти MITM, сервер зазвичай надсилає клієнту свій сертифікат (ланцюг) і автентифікує рукостискання, використовуючи ключ у сертифікаті. (Є також деякі інші варіанти, наприклад, аутентифікація клієнта або TLS-PSK, але вони не сильно використовуються з HTTP.) Клієнт може або перевірити сертифікат (звичайним способом), або проігнорувати його.

Хоча SNI важливий при використанні декількох сертифікатів TLS під час однієї IP-адреси, не важливо, щоб сервер міг розшифрувати запит. Без SNI сервер не знає, який ланцюжок сертифікатів слід надсилати, тому сервер зазвичай вибирає один (наприклад, перший vhost), що, звичайно, може бути неправильним. Якщо сервер вибирає неправильний ланцюжок сертифікатів, клієнт повинен відмовитись від нього (тому він не продовжує надсилати HTTP-запит). Однак якщо клієнт ігнорує сертифікат (або якщо недійсний сертифікат позначений як довірений для цього сайту), він може успішно продовжуватись. Оскільки симетричний ключ, який використовується для шифрування, не залежить від сертифіката (TLS призначений також для роботи без сертифікатів), сервер може розшифрувати його.

Лише незначна примітка, чому я пишу про TLS, тоді як ви запитували про SSL: TLS - це нова версія SSL. Усі версії SSL вважаються небезпечними для загального використання, тому ми в основному використовуємо TLS (1.0, 1.1, 1.2).


"Запит HTTP не шифрується відкритим ключем сервера. Він шифрується симетричним шифром за допомогою ключа, узгодженого в попередньому рукостисканні." Не знав цього, дякую за голову! Я знаю, однак, що TLS замінив SSL, але ми дотримувались загальноприйнятого терміна "SSL сертифікат", звідси моє згадування.
paolo

Я знаю, що такі терміни, як "SSL сертифікат", часто зустрічаються для TLS. Я намагаюся їх уникати, але не був впевнений, чи знаєте ви (або інші) термін TLS.
v6ak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.