Як насправді працює SSL?


143

Як працює SSL?

Де встановлений сертифікат на клієнті (або браузері?) Та сервері (або веб-сервері?)?

Як починається процес довіри / шифрування / автентифікації, коли ви вводите URL-адресу в браузер і отримуєте сторінку від сервера?

Як протокол HTTPS розпізнає сертифікат? Чому HTTP не може працювати з сертифікатами, коли саме ці сертифікати виконують усі функції довіри / шифрування / автентифікації?


24
Я думаю, що це розумне питання - розуміння того, як працює SSL - це крок 1, правильно його реалізувати - це крок 2 до крокової нескінченності.
синтезаторпатель



5
@StingyJack Не будьте тут нацистською політикою. Люди приходять шукати допомоги. Не відмовляйте їм у всій допомозі, оскільки ви вважаєте, що питання не зовсім відповідає правилам.
Корай Тугай

1
@KorayTugay - ніхто не відмовляє у допомозі. Це належить до Security або Sysadmin, де він краще орієнтований, але ОП, як правило, виграє на цьому форумі, додавши трохи програмного контексту замість розміщення загального ІТ-питання. Скільки людей закривають запитання, коли вони не пов'язані з конкретною проблемою програмування? Напевно, занадто багато, отже, мій підштовхуючий ОП, щоб зробити це об'єднання.
StingyJack

Відповіді:


144

Примітка. Свою оригінальну відповідь я написав дуже поспішно, але з тих пір це перетворилося на досить популярне запитання / відповідь, тому я її трохи розширив і зробив більш точним.

Можливості TLS

"SSL" - це ім'я, яке найчастіше використовується для позначення цього протоколу, але SSL спеціально посилається на фірмовий протокол, розроблений Netscape в середині 90-х. "TLS" - це стандарт IETF, заснований на SSL, тому я буду використовувати TLS у своїй відповіді. Сьогодні шанси на те, що майже всі ваші захищені з'єднання в Інтернеті справді використовують TLS, а не SSL.

TLS має кілька можливостей:

  1. Зашифруйте дані рівня додатків. (У вашому випадку протоколом рівня додатків є HTTP.)
  2. Аутентифікувати сервер для клієнта.
  3. Аутентифікувати клієнта на сервері.

№1 і №2 дуже поширені. №3 зустрічається рідше. Ви, здається, зосереджуєтесь на №2, тому я поясню цю частину.

Аутентифікація

Сервер ідентифікує себе клієнту за допомогою сертифіката. Сертифікат - це сукупність даних [1], яка містить інформацію про веб-сайт:

  • Доменне ім'я
  • Публічний ключ
  • Компанія, яка їй належить
  • Коли він був виданий
  • Коли термін його дії закінчується
  • Хто його видав
  • І т.д.

Ви можете домогтися конфіденційності (№1 вище), використовуючи відкритий ключ, включений у сертифікат, для шифрування повідомлень, які можна розшифрувати лише відповідним приватним ключем, який слід безпечно зберігати на цьому сервері. [2] Давайте назвемо цю ключову пару KP1, щоб згодом не заплутатися. Ви також можете перевірити, чи відповідає доменне ім'я сертифіката веб-сайту, який ви відвідуєте (№2 вище).

Але що робити, якщо супротивник може змінити пакети, надіслані на сервер і з нього, і що робити, якщо той противник змінив сертифікат, який вам подарували, і вставив власний відкритий ключ або змінив будь-які інші важливі дані? Якщо це сталося, противник міг перехопити та змінити будь-які повідомлення, які, на вашу думку, надійно зашифровані.

Щоб запобігти цій самій атаці, сертифікат криптографічно підписується чиїсь приватним ключем таким чином, що підпис може перевірити будь-хто, хто має відповідний відкритий ключ. Давайте назвемо цю ключову пару KP2, щоб зрозуміти, що це не ті самі ключі, якими користується сервер.

Органи сертифікації

То хто створив KP2? Хто підписав довідку?

Дещо спрощуючи, сертифікаційний орган створює KP2, і вони продають послугу використання свого приватного ключа для підписання сертифікатів для інших організацій. Наприклад, я створюю сертифікат і плачу такій компанії, як Verisign, щоб підписати його своїм приватним ключем. [3] Оскільки ніхто, крім Verisign, не має доступу до цього приватного ключа, ніхто з нас не може підробити цей підпис.

І як я особисто отримав відкритий ключ у KP2, щоб підтвердити цю підпис?

Ми вже бачили, що сертифікат може містити відкритий ключ - а комп'ютерні фахівці люблять рекурсію - так чому б не ввести відкритий ключ KP2 у сертифікат і не поширити його таким чином? Спочатку це звучить трохи шалено, але насправді саме так воно і працює. Продовжуючи приклад Verisign, Verisign виробляє сертифікат, який включає інформацію про те, хто вони є, які типи речей вони можуть підписувати (інші сертифікати) та їх відкритий ключ.

Тепер, якщо у мене є копія цього сертифікату Verisign, я можу використовувати його для перевірки підпису на сертифікаті сервера для веб-сайту, який я хочу відвідати. Легко, правда ?!

Ну, не так швидко. Мені довелося десь отримати сертифікат Verisign . Що робити, якщо хтось підробляє сертифікат Verisign і додає туди свій відкритий ключ? Тоді вони можуть підробити підпис на сертифікаті сервера, і ми повернулися туди, де ми почали: атака "людина-в-середині".

Ланцюжки сертифікатів

Продовжуючи рекурсивно мислити, ми, звичайно, можемо ввести третій сертифікат і третю пару ключів (KP3) і використовувати це для підписання сертифікату Verisign. Ми називаємо це ланцюжком сертифікатів: кожен сертифікат у ланцюжку використовується для перевірки наступного сертифіката. Сподіваємось, ви вже можете побачити, що цей рекурсивний підхід - це лише черепахи / сертифікати аж донизу. Де зупиняється?

Оскільки ми не можемо створити нескінченну кількість сертифікатів, очевидно, що ланцюжок сертифікатів повинен десь зупинитися , і це робиться, включивши сертифікат у ланцюг, який самостійно підписується .

Я на хвилину замовчу, поки ти вибереш шматочки мозкової речовини з голови, що вибухає. Самопідпис ?!

Так, наприкінці ланцюжка сертифікатів (він же "корінь") з'явиться сертифікат, який використовує власну клавішу для підписання. Це усуває нескінченну проблему рекурсії, але вона не виправляє проблему автентифікації. Будь-хто може створити самопідписаний сертифікат, який говорить про що завгодно, так само як я можу створити фальшивий диплом Принстона, який говорить про те, що я потрійно маю на увазі політику, теоретичну фізику та застосовую ноги, а потім підпишу своє власне ім’я внизу.

[Дещо незвичне] рішення цієї проблеми полягає лише в тому, щоб вибрати якийсь набір самопідписаних сертифікатів, яким ви явно довіряєте. Наприклад, я можу сказати: "Я довіряю цьому сертифікату самопідписання Verisign".

Маючи таку явну довіру, тепер я можу підтвердити весь ланцюжок сертифікатів. Незалежно від того, скільки сертифікатів у ланцюжку є, я можу підтвердити кожен підпис аж до кореня. Коли я дістаюсь до кореня, я можу перевірити, чи є цей кореневий сертифікат, якому я явно довіряю. Якщо так, то я можу довіряти всій ланцюжку.

Довірена довіра

Для аутентифікації в TLS використовується система наданої довіри . Якщо я хочу найняти автомеханіка, я не можу довіряти жодному випадковому механіку, який я знайду. Але, можливо, мій друг поручається на конкретного механіка. Оскільки я довіряю своєму другові, то я можу довіряти цьому механіку.

Купуючи комп'ютер або завантажуючи веб-переглядач, він отримує декілька сотень кореневих сертифікатів, яким він явно довіряє. [4] Компанії, які володіють цими сертифікатами та керують ними, можуть надавати довіру іншим організаціям, підписуючи свої сертифікати.

Це далеко не досконала система. Інколи КА може помилково видавати сертифікат. У цих випадках сертифікат, можливо, буде потрібно відкликати. Скасування є складним, оскільки виданий сертифікат завжди буде криптографічно правильним; позапрофільний протокол необхідний, щоб з’ясувати, які раніше дійсні сертифікати були анульовані. На практиці деякі з цих протоколів не надто захищені, і багато браузери все одно не перевіряють їх.

Іноді весь ЦА піддається компрометації. Наприклад, якщо ви повинні прорватися до Verisign і викрасти їх кореневий ключ для підписання, ви можете підробити будь-який сертифікат у світі. Зверніть увагу, що це не стосується лише клієнтів Verisign: навіть якщо мій сертифікат підписує Thawte (конкурент Verisign), це не має значення. Мій сертифікат все ще можна підробити за допомогою компромісного ключа підпису від Verisign.

Це не просто теоретично. Це сталося в дикій природі. DigiNotar був зламаний, а згодом збанкрутував. Комодо також був зламаний , але незрозуміло, що вони залишаються в бізнесі і донині.

Навіть коли ЦС не піддаються прямому злому, в цій системі є й інші загрози. Наприклад, уряд використовує юридичний примус, щоб примусити ЦС підписати підроблену довідку. Ваш роботодавець може встановити власний сертифікат CA на комп'ютер вашого працівника. У цих різних випадках трафік, який ви очікуєте "захищений", насправді повністю видимий / модифікований для організації, яка контролює цей сертифікат.

Запропоновано деякі заміни, зокрема конвергенція , TACK та DANE .

Кінцеві замітки

[1] Дані сертифіката TLS відформатований в відповідно до стандартом X.509 . X.509 заснований на ASN.1 ("Абстрактна нотація синтаксису №1"), що означає, що це не бінарний формат даних. Тому X.509 повинен бути закодований у двійковий формат. DER і PEM - це два найпоширеніші кодування, про які я знаю.

[2] На практиці протокол насправді переходить на симетричний шифр, але це деталь, яка не стосується вашого питання.

[3] Імовірно, CA фактично підтверджує, хто ти є, перед тим, як підписати свій сертифікат. Якщо вони цього не зробили, я можу просто створити сертифікат для google.com і попросити ЦА підписати його. З цим сертифікатом я міг би перетворити будь-яке "безпечне" з'єднання з google.com. Тому крок перевірки є дуже важливим фактором в роботі СА. На жаль, не дуже зрозуміло, наскільки жорсткий цей процес перевірки у сотнях ЦА по всьому світу.

[4] Див. Список надійних ЦО Mozilla .


Що таке приватний ключ?
Корай Тугай

ви забули згадати, що відкритий ключ є частиною файлу сертифікатів, що надсилається на веб-сайт, щоб розшифрувати дані, в першу чергу зашифровані ними.
mamdouh alramadan

Дякую @mamdouhalramadan. Я відредагував, щоб згадати про це.
Марк Е. Хааз

2
@mamdouhalramadan "відкритий ключ ... надсилається на веб-сайт для розшифрування даних". Як відкритий ключ можна використовувати для розшифрування даних?
Тедді

@ateddy Ви маєте рацію. Це не може. Відкритий ключ використовується лише для аутентифікації. Тут твердження, що пари ключів також використовуються для шифрування та дешифрування, є невірним. Для цього використовується надійно узгоджений ключ сесії.
Маркіз Лорн

53

HTTPS - це комбінація HTTP та SSL (Secure Socket Layer) для забезпечення зашифрованого зв’язку між клієнтом (браузером) та веб-сервером (тут розміщується програма).

Для чого це потрібно?

HTTPS шифрує дані, які передаються від браузера до сервера по мережі. Отже, ніхто не може нюхати дані під час передачі.

Як встановлюється з'єднання HTTPS між браузером та веб-сервером?

  1. Браузер намагається підключитися до https://payment.com .
  2. сервер Payment.com надсилає сертифікат браузеру. Цей сертифікат включає відкритий ключ сервера Payment.com та деякі докази того, що цей відкритий ключ насправді належить платежу.com.
  3. Браузер перевіряє сертифікат, щоб підтвердити, що він має належний відкритий ключ для Payment.com.
  4. Браузер вибирає випадковий новий симетричний ключ K, який буде використаний для підключення до сервера Payment.com. Він шифрує K під відкритим ключем Payment.com.
  5. Payment.com розшифровує K за допомогою свого приватного ключа. Тепер і браузер, і платіжний сервер знають K, але більше ніхто цього не робить.
  6. У будь-який час браузер хоче щось надіслати на Payment.com, він зашифровує його під K; сервер Payment.com розшифровує його після отримання. Щоразу, коли сервер Payment.com захоче щось надіслати у ваш браузер, він шифрує його під K.

Цей потік може бути представлений наступною схемою: введіть тут опис зображення


1
Частина про шифрування та відправлення сеансового ключа та розшифрування його на сервері є повною і непотрібною. Ключ сеансу взагалі ніколи не передається: він встановлюється за допомогою захищеного ключа алгоритму negoatiaon. Будь ласка, перевірте свої факти, перш ніж публікувати подібні дурниці. RFC 2246.
Маркіз Лорн

Чому браузер не використовує відкритий ключ сервера для шифрування даних під час публікації його на сервері, а не створення випадкового нового симетричного ключа K на кроці 4?
KevinBui

1
@KevinBui Тому що для надсилання відповіді з сервера потрібно, щоб клієнт мав пару ключів і тому, що асиметричне шифрування дуже повільне.
Маркіз

3

Я написав невеличку публікацію в блозі, де коротко обговорюється процес. Будь ласка, погляньте.

SSL рукостискання

Невеликий фрагмент із цього ж виглядає так:

"Клієнт робить запит на сервер через HTTPS. Сервер надсилає копію свого сертифіката SSL + відкритий ключ. Після перевірки ідентичності сервера в локальному надійному сховищі CA клієнт створює секретний ключ сеансу, шифрує його за допомогою загальнодоступного сервера ключ та відправляє його. Сервер розшифровує секретний ключ сеансу за допомогою приватного ключа та надсилає підтвердження клієнтові. Захищений канал встановлений ".


"Після перевірки ідентичності сервера з його локальним надійним магазином CA" - це не зовсім суто. Я можу використовувати самопідписаний сертифікат, і HTTPS буде працювати - я можу отримати безпечне з'єднання HTTPS з сервером . Довірений сертифікат надходить лише тоді, коли я хочу переконатися, що я розмовляю з правильним сервером.
Тедді

Частина про шифрування та відправлення сеансового ключа та розшифрування його на сервері є повною і непотрібною. Ключ сеансу взагалі ніколи не передається: він встановлюється за допомогою захищеного ключа алгоритму negoatiaon. Будь ласка, перевірте свої факти, перш ніж публікувати подібні дурниці. RFC 2246.
Маркіз Лорн

@Teddy Це неправильно. Перевірка довіри сертифікатів є обов'язковою частиною SSL. Його можна обійти, але це зазвичай діє: самопідписані сертифікати не працюють без спеціальних заходів того чи іншого.
Маркіз Лорн

2

Мехааз уже це детально пояснив. Я додам свої 2 центи до цієї серії. У мене багато блог-постів, що обертаються навколо рукостискання та сертифікатів SSL. Хоча більша частина цього обертається навколо веб-сервера IIS, публікація все ще має відношення до рукостискання SSL / TLS загалом. Ось кілька для довідки:

Не розглядайте CERTIFICATES і SSL як одну з тем. Ставтесь до них як до 2 різних тем, а потім спробуйте побачити, з ким вони працюють спільно. Це допоможе вам відповісти на питання.

Встановлення довіри між учасниками спілкування через магазин сертифікатів

Комунікація SSL / TLS працює виключно на основі довіри. Кожен комп'ютер (клієнт / сервер) в Інтернеті має список кореневих та проміжних ЦА, які він підтримує. Вони періодично оновлюються. Під час рукостискання з SSL це використовується як орієнтир для встановлення довіри. Для іспиту, під час передачі SSL, коли клієнт надає сервер сертифікат. Сервер намагатиметься перевірити, чи є ЦА, який видав сертифікат, у своєму списку ЦО. Якщо він не може цього зробити, він заявляє, що не зміг здійснити верифікацію ланцюга сертифікатів. (Це частина відповіді. Це також дивиться на AIAдля цього.) Клієнт також робить аналогічну перевірку сертифіката сервера, який він отримує в сервісі Hello. У Windows ви можете бачити сховища сертифікатів для клієнта та сервера через PowerShell. Виконайте нижче з консолі PowerShell.

PS Cert:> ls Розташування: CurrentUser StoreNames: {TrustedPublisher, ClientAuthIssuer, Root, UserDS ...}

Розташування: Імена LocalMachine Store: {TrustedPublisher, ClientAuthIssuer, Віддалений робочий стіл, Root ...}

Веб-переглядачі, такі як Firefox та Opera, не покладаються на основу ОС для управління сертифікатами. Вони підтримують власні окремі магазини сертифікатів.

У рукостисканні SSL використовується як симетрична, так і криптографія відкритого ключа. Автентифікація сервера відбувається за замовчуванням. Аутентифікація клієнта не є обов'язковою і залежить, налаштована кінцева точка Сервера для автентифікації клієнта чи ні. Повідомте про мій пост у блозі, коли я це детально пояснив.

Нарешті для цього питання

Як протокол HTTPS розпізнає сертифікат? Чому HTTP не може працювати з сертифікатами, коли саме ці сертифікати виконують усі функції довіри / шифрування / автентифікації?

Сертифікати - це просто файл, формат якого визначений стандартом X.509 . Це електронний документ, який підтверджує особу сторони, що спілкується. HTTPS = HTTP + SSL - це протокол, який визначає вказівки щодо того, як 2 сторони повинні спілкуватися один з одним.

БІЛЬШЕ ІНФОРМАЦІЇ

  • Щоб зрозуміти сертифікати, вам доведеться зрозуміти, що таке сертифікати, а також прочитати про управління сертифікатами. Це важливо.
  • Як тільки це буде зрозуміло, тоді продовжуйте рукостискання TLS / SSL. Для цього ви можете звернутися до RFC. Але вони є скелетом, який визначає настанови. Є кілька постів для блогів, включаючи мій, які детально пояснюють це.

Якщо вищезазначена діяльність буде виконана, то ви будете добре розуміти Сертифікати та SSL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.