– 1996 г.; • HTTP/1.1 первый вариант – 1999 г. (RFC 2616); • HTTP/1.1 текущий вариант – 2014 г. (RFCs 7230, 7231, 7232, 7233, 7234, и 7235); • HTTP/2.0 – есть черновик стандарта, основывается на SPDY. 3
keep-alive Cache-Control: no-cache Pragma: no-cache Accept: text/html,application/xhtml+xml User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) Accept-Encoding: gzip,deflate,sdch Accept-Language: ru,en;q=0.8 Cookie: foo=bar; foo2=bar3 Метод Версия протокола Запрашиваемый ресурс Передаваемые куки Заголовок • Заголовок может содержать данные к примеру для POST метода
виртуальный хост относится к практике размещения более чем одного веб-сайта (например, www.example.com и www.example.org) на одной машине. Виртуальный хост может быть как «привязанным к IP-адресу», что означает использование отдельного IP адреса для каждого сайта, либо «привязанным к имени», позволяя вам иметь несколько различных имён для каждого IP-адреса. Факт того, что эти сайты работают на одном и том же физическом сервере, не очевиден конечным пользователям. 8
поддержки постоянных соединений – соединения закрывались сразу после пары запрос/ ответ; • В процессе добавили реализацию на уровене приложений через заголовок Connection: Keep-Alive. Клиент посылает заголовок: Connection: Keep-Alive Если сервер также поддерживает расширение – он в свою очередь тоже должен добавить в ответ заголовок: Connection: Keep-Alive 10
уменьшить время задержки, т.к. не нужно переустанавливать TCP соединение (TCP 3-Way-Handshake). • увеличить пропускную способность соединения, т.к. из-за существования в TCP механизма для управления перегрузками сети – “медленный старт” (TCP slow start), значение TCP окна стартует с маленьких единиц и растёт в течении передачи данных. 12
его размера и не буферезируя его на стороне сервера. HTTP/1.1 200 OK Server: nginx Content-Type: text/html Transfer-Encoding: chunked 23 This is the data in the first chunk 1A and this is the second one 3 con 8 sequence 0 15
requests). Если ресурс не изменился – получим ответ с кодом 304 Not Modified. Делятся на две категори: • зависят от времени (time-based): Cache-Control:public, max-age=31536000 Last-Modified: Mon, 03 Sep 2014 17:45:57 GMT If-Modified-Since: Mon, 03 Sep 2014 17:45:57 GMT • зависят от содержания (сontent-based, ETag): Cache-Control:public, max-age=31536000 ETag: "d41d8cd98f00b204e9800998ecf8427e" If-None-Match: "d41d8cd98f00b204e9800998ecf8427e" 18
компанией Netscape для проведения безопасной электронной коммерции в сети Интернет. Когда SSL проходил стандартизацию у IETF он был переименован в Transport Layer Security (TLS). Многие используют SSL и TLS как синонимы, однако на самом деле они описывают разные версии протокола. 21
тот, с кем я говорю. • Целостность данных – никто не может вмешаться в процесс передачи. • Шифрование – никто не может видеть какие именно данные передаются. 22 TCP IP TLS HTTP HTTPS
• на несколько доменов (Subject Alternative Names SAN): example.com, www.example.com и www.example.org; • wildcard на несколько доменов по маске: *.example.com (покрывает www.example.com, mail.exmaple.com, но НЕ example.com и НЕ w2.www.example.com). 25
and prioritizing ECDHE cipher suites actually caused negligible increase in CPU usage. HTTP keepalives and session resumption mean that most requests do not require a full handshake, so handshake operations do not dominate our CPU usage. Facebook (http://lists.w3.org/Archives/Public/ietf-http-wg/2012JulSep/ 0251.html): We have found that modern software-based TLS implementations running on commodity CPUs are fast enough to handle heavy HTTPS traffic load without needing to resort to dedicated cryptographic hardware. Всё это касается последних версий OpenSSL > 1.0 30
сессионных ключей – небезопасен т.к. в случае компрометированная приватного ключа, можно расшифровать всю сессию. В наши дни необходимо использовать PFS – так как в этом случае для каждой сессии генерируются новый ключ. Пример из TLS 1.2: ECDHE-RSA-AES128-GCM-SHA256 31
TCP ACK TCP SYN TCP SYN-ACK ② ClientHello 1. Установили TCP соединение. 2. Клиент посылает в текстовом формате: • версию TLS протокола; • список cipher suites; • другое. ① ① 1 RTT = 40ms
ServerHello Certificate ServerHelloDone TCP ACK TCP SYN TCP SYN-ACK ② ClientHello ③ ① ① 3. Сервер в ServerHello: • выбирает версию протокола; • выбирает шифры; • другое. В секции Certificate: • добавляем сертификат в ответ; • добавляет полную цепочку Intermidate CA (если есть); • корневые сертификаты не передаются (уже в браузере). 1 RTT = 40ms
ServerHello Certificate ServerHelloDone TCP ACK TCP SYN TCP SYN-ACK ClientHello ClientKeyExchange ChangeCipherSpec Finished ③ ④ ① ① ② 4. Клиент: • проверяет сертификат (+X секунд); • начинает обмен ключами (RSA или Diffie-Hellman для PFS). 1 RTT = 40ms
ServerHello Certificate ServerHelloDone TCP ACK TCP SYN TCP SYN-ACK ② ClientHello ClientKeyExchange ChangeCipherSpec Finished ChangeCipherSpec Finished ① ① ③ ④ ⑤ 5. Сервер: • принимает обмен ключами; • проверяет message authentication code (MAC); • и возвращает зашифрованное сообщение “Finished”. 1 RTT = 40ms
больше одного сервера – нужно синхронизировать хранилище Session ID, что само по себе дорого по времени и безопасности. Решение – TLS Session Ticket rfc5077. Поддержка Яндекс Браузере, Chrome и Firefox. Nginx: ssl_session_ticket_key current.key; ssl_session_ticket_key previous01.key; ssl_session_ticket_key previous02.key; Ключи должны переодически меняться, т.к. в противном случае знание ключа делает уязвимым даже Perfect Forward Secrecy. 45
хороши для работы с клиентами, которые пришли к нам повторно, но не помогает в случае с новыми или с теми у кого закончилось время действия сессии. “False Start” не изменяет протокол, а изменяет время когда данные HTTP могут быть отправлены. Необходимо на стороне сервера: • PFS; • NPN. 47
довольно большие; • нет механизма инвалидации кеша. Online Certificate Status Protocol (OCSP): • онлайн проверка; • CA должен иметь возможность обрабатывать запросы; • uptime; • клиент блокируется на OCSP; • приватность.
сертификата: • добавляем к сертификату OCSP ответ от CA; • кешируем ответ от CA на стороне сервера. Однако нужно иметь в ввиду: • OCSP ответ может быть вплоть до 4K – важно не перегрузить TCP окно (смотрим в настройки initcwnd). 51
– для этого клиенту необходимо знать только IP адрес другой стороны. Но, что если мы хотим на одном и том же IP поднять разные виртуальные хосты с SSL? • Использовать новый IP • Использовать SNI SNI по аналогии с HTTP – на этапе хендшейка клиент посылает имя хоста для которого хочет получить сертификат. Поддержка: нет полной поддержки на Windows XP IE 6,7 и Android 2.2. 52
схемо-независимые. Было: <a href="http://example.com/bar"> Стало: <a href="//example.com/bar"> • HTTP Strict Transport Security (HSTS) – заголовок, который говорит браузеру что необходимо устанавливать только защищённые соединения для всех ресурсов страницы: Strict-Transport-Security: max-age=31536000 53