Неочевидные детали
при запуске HTTPS в
OK.Ru
Андрей Домась
Кто я такой?
Андрей Домась
Одноклассники
Ведущий системный администратор
Нехорошие операторы и провайдеры
Нехорошие операторы и провайдеры
Ускорение загрузки страниц
Нехорошие операторы и провайдеры
Ускорение загрузки страниц
Финансовые сервисы
Как устроен TLS
Шифры
Сертификат X.509
“Правильные” настройки сервера
Как устроен TLS
Шифры
Сертификат X.509
“Правильные” настройки сервера
https://wiki.mozilla.org/Security/Server_Side_TLS
Неочевидные детали при
запуске HTTPS в OK.Ru
Чего мы опасались?
1.Нужно еще больше серверов
Чего мы опасались?
1.Нужно еще больше серверов
2.Появится Mixed Content
Чего мы опасались?
1.Нужно еще больше серверов
2.Появится Mixed Content
3.Что-то начнет тормозить
Round-Trip Time (RTT)
Client
Server
SYN
SYN/ACK
ACK
Round-Trip Time (RTT)
Client
Server
SYN
SYN/ACK
ACK
New York: 200 ms
200 ms
Round-Trip Time (RTT)
Client
Server
SYN
SYN/ACK
ACK
ClientHello
ServerHello
Client Key Exchange
Server Finish
New York: 200 ms
200 ms
400 ms
Round-Trip Time (RTT)
Client
Server
SYN
SYN/ACK
ACK
ClientHello
ServerHello
Client Key Exchange
Server Finish
New York: 200 ms
200 ms
400 ms
0.6 sec
Round-Trip Time (RTT)
Client
Server
SYN
SYN/ACK
ACK
ClientHello
ServerHello
Client Key Exchange
Server Finish
New York: 200 ms
200 ms
400 ms
0.6 sec
1 mln MUA in US
1. Нужно еще больше серверов
2. Появится Mixed Content
3. Что-то начнет тормозить
Чего мы опасались?
CPU & RTT
Browser WEB-siteHTTPS
Browser WEB-siteHTTPS
Ciphers Ciphers
Cert Cert
Browser WEB-siteHTTPS
Master Key
Ciphers Ciphers
Master Key
Cert Cert
Master Key Exchange
Browser WEB-siteHTTPS
Master Key
Ciphers Ciphers
Master Key
Cert Cert
Master Key Exchange
TLS session TLS session
Browser WEB-siteHTTPS
Master Key
Ciphers Ciphers
Master Key
Cert Cert
Master Key Exchange
Full Handshake
Browser WEB-siteHTTPS
Master Key
Ciphers Ciphers
Master Key
1 Round-Trip
CPU intensive!
Cert Cert
Master Key Exchange
Full Handshake
Client Server
Full Handshake
Client Server
Full Handshake
TLS-sessionTLS-session
Client Server
Full Handshake
TLS-session
id: 12345
session-id: 12345TLS-session
id: 12345
Client Server
Full Handshake
TLS-session
id: 12345
session-id: 12345
session-id: 12345
TLS-session
id: 12345
check/restore
Client Server
Full Handshake
TLS-session
id: 12345
session-id: 12345
session-id: 12345
TLS-session
id: 12345
check/restore
Abbreviated Handshake
Client Server
Full Handshake
TLS-session
id: 12345
session-id: 12345
session-id: 12345
TLS-session
id: 12345
Server2
check/restore
Client Server
Full Handshake
TLS-sessionTLS-session
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
check/restore
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
check/restore
Abbreviated Handshake
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
check/restore
Abbreviated Handshake
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
check/restore
Abbreviated Handshake
rfc 5077
,
APR
one-nio
APR
one-nio
Client
nginx
ticket
Client
nginx
ticket
ticket
nginx
Client
nginx
ticket
ticket
nginx
Client
nginx
ticket
ticket
nginx
ticket
Client
nginx
ticket
ticket
nginx
haproxy
Client
nginx
ticket
ticket
nginx
haproxy
ticket
Application
(server)
Application
(server)
Session
ticket
Application
(server)
Session
ticket
Application
(server)
Session
Session Context
“text”
ticket
Application
(server)
Session
Session Context
“text”
“text”
ticket
Application
(server)
Session
Session Context
“text”
“text”
“text”?
Session Context
“...it would be possible, to re-import a session generated from another
context (e.g. another application), which might lead to malfunctions.”
Session Context
• Apache Tomcat Native: “_default_:443”
• nginx: “HTTP”
• haproxy: “haproxy”
Client Server
Full Handshake
TLS-sessionTLS-session
keyticketticket
check/restore
Abbreviated Handshake
Client
Full Handshake
TLS-sessionTLS-session
keyticket
check/restore
Abbreviated Handshake
ticket
Server
FQDN + port
Что в итоге?
Можно ли использовать везде один ключ?
Нужно еще меньше CPU!
AVX/AVX2
AVX/AVX2 + openssl 1.0.2
AVX (20%) Session Ticket (15%)
На что еще клиент тратит
время?
Certificate
authority
(CA)
Certificate
authority
(CA)
Certificates
Certificate
authority
(CA)
Certificates
Browser WEB-site
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
revoked
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
revoked
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
revoked
OCSP
signature
OCSP - Online Certificate Status Protocol
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
revoked
OCSP
signature
Certificate
authority
(CA)
Certificates
Browser WEB-siteHTTPS
revoked
OCSP
signature
OCSP Stapling
Каков выигрыш?
Каков выигрыш?
67 ms
Каков выигрыш?
67 ms
+
200 ms
25%
1.Сломался механизм ротации OCSP: downtime
1.Сломался механизм ротации OCSP: downtime
2.Плохой OCSP-ответ: downtime
1.Сломался механизм ротации OCSP: downtime
2.Плохой OCSP-ответ: downtime
3.Меняем серверный сертификат: downtime
Механизм отключения OCSP Stapling
Mixed Content
1.Что в нем плохого?
2.В чем сложность борьбы с ним?
Mixed Content
Active
● <script> (src attribute)
● <link> (href attribute) (this includes CSS
stylesheets)
● <iframe> (src attribute)
● XMLHttpRequest requests
● All cases in CSS where a url value is used
(@font-face, cursor, background-image, and
so forth).
● <object> (data attribute)
Passive
● <img> (src attribute)
● <audio> (src attribute)
● <video> (src attribute)
● <object> subresources
В чем сложность?
1.Он происходит в браузере
В чем сложность?
1.Он происходит в браузере
2.На странице много чужих ресурсов
Content-Security-Policy
Content-Security-Policy
Content-Security-Policy-Report-Only
POST
{
"blocked-uri": "http://homeland.ugo-games.com",
"document-uri": "https://ok.ru/appsPreset/https_games/",
"effective-directive": "img-src",
"original-policy": "default-src data: blob: about: 'self' 'unsafe-inline' 'unsafe-eval' https:;
report-uri /csp/report?always;",
"referrer":
"https://ok.ru/web/gwt/3e8af28/one.app.community.dk.gwt.dm.block.Block/BF2E365744786A7
4515E6A4678785A4A.cache.html",
"status-code": 0,
"violated-directive": "default-src data: blob: about: 'self' 'unsafe-inline' 'unsafe-eval' https:"
}
{
"blocked-uri": "safari-extension://com.evernote.safari.clipper-q79wdw8yh9",
"document-uri": https://connect.ok.ru/dk?st.cmd=WidgetShare&st....",
"original-policy": "default-src data: blob: about: 'self' 'unsafe-inline' 'unsafe-eval' https:; report-uri
/csp/report?always;",
"referrer": "http://fishki.net/1819857-chego-nelzja-delat-na-kube.html",
"violated-directive": "default-src data: blob: about: 'self' 'unsafe-inline' 'unsafe-eval' https:"
}
Редирект на HTTPS
Редирект на HTTPS
• Старые смартфоны
Редирект на HTTPS
• Старые смартфоны:
• Смартфон: RSA 1024 bits
Редирект на HTTPS
• Старые смартфоны:
• Смартфон: RSA 1024 bits
• Наш TLS: RSA 2048 bits
Редирект на HTTPS
• Старые смартфоны:
• Смартфон: RSA 1024 bits
• Наш TLS: RSA 2048 bits
• SmartTV: тормозят
Редирект на HTTPS
• Старые смартфоны:
• Смартфон: RSA 1024 bits
• Наш TLS: RSA 2048 bits
• SmartTV: тормозят
• Пароли не подходят!
• Лучше иметь отдельный ключ для шифрования TLS-тикетов
• Лучше иметь отдельный ключ для шифрования TLS-тикетов
• Оперативное отключение OCSP Stapling
• Лучше иметь отдельный ключ для шифрования TLS-тикетов
• Оперативное отключение OCSP Stapling
• Mixed Content: используйте CSP-reports, но много мусора
• Лучше иметь отдельный ключ для шифрования TLS-тикетов
• Оперативное отключение OCSP Stapling
• Mixed Content: используйте CSP-reports, но много мусора
• Надо что-то делать со старыми клиентами
• Лучше иметь отдельный ключ для шифрования TLS-тикетов
• Оперативное отключение OCSP Stapling
• Mixed Content: используйте CSP-reports, но много мусора
• Надо что-то делать со старыми клиентами
• Браузеры забудут сохраненные пароли
Андрей Домась
https://habrahabr.ru/company/odnoklassniki
andrey.domas@corp.mail.ru

Неочевидные детали при запуске HTTPS в OK.Ru / Андрей Домась (Одноклассники)

Editor's Notes

  • #4 не стесняясь, вырезали на нашем портале нашу же рекламу и подставляли на ее место свою
  • #5 Выступление на HL 2015 “Скорость с доставкой для пользователя” Анатолия Орлова
  • #6 Совокупность причин дала нам понять Момент настал - HTTPS
  • #7 Перед вами список тем в которые необходимо погрузиться.
  • #8 Не буду рассказывать Вместо этого...
  • #9 Вернемся немного назад в прошлое, когда мы только готовились взяться за проект. Что нас беспокоило?
  • #10 Криптография - дополнительные вычисления… нужно больше CPU!
  • #11 [Что это такое?] Все зеленое, но как победить?
  • #12 А как же ускорение, антивирусы и DPI?
  • #13 Это время приемо-передачи (время отправки + время получения подтверждения) TCP - HTTP
  • #14 Пинг до NY: 200 мс Медленно, но что ж поделать... В пустую 200 мс.
  • #15 Включаем HTTPS - еще 400 ms Что это значит?
  • #16 NY ждет первой порции данных через 0.6 сек. На сколько это проблема?
  • #17 1 млн активных пользователей в США
  • #18 Мы закрыли все вопросы, но подводные камни. Хочу поделиться опытом и знаниями.
  • #19 Мы начали с этого.
  • #20 Клиент пришел - что происходит?
  • #21 Обменялись сертификатами, согласовали шифры и пр.
  • #22 Безопасно согласовали симм. мастер-ключ, которым потом все будет шифроваться.
  • #23 Набор данных с каждой стороны - это сессия.
  • #24 Это действо - Full Handshake. Это плохо. Почему?
  • #25 Тут 1 RTT и CPU из-за Diffie-Hellman Клиенту пофиг. Серверу нет.
  • #26 Итак, Full Handshake состоялся
  • #27 Образовались сессии с двух сторон
  • #28 Сервер сообщает клиенту id своей сессии Клиент ассоциирует этот серверный id со своей сессией
  • #29 Через какое-то время...
  • #30 Это называется Abbreviated Handshake - сессия используется повторно. Но у нас многие сотни фронтов….
  • #31 Можно расшарить хранилище сессий… Но… bottleneck ресурсы точка отказа А Интернет-проекты росли...
  • #32 И был придуман др. механизм. Опять Full Handshake, опять сесии.
  • #33 Сервер шифирует сессию - тикет. Отдает ее. Блоб - это тикет.
  • #34 Клиент ассоциирует
  • #35 Через какое-то время
  • #36 Это тоже Abbreviated Handshake
  • #37 Ключ должен быть одинаковый - stateless
  • #38 Это rfc 5077
  • #39 Все это известно, что дальше? Мы почитали rfc, стали тестировать
  • #40 А надо сказать, что у нас много разных фронтов.
  • #41 Их всех объединяет openssl и код примерно одинаковый
  • #42 Проводим эксперимент Клиент пришел к nginx и получил от него тикет
  • #43 С тикетом к др. nginx
  • #44 Ключ одинаковый
  • #45 Тикет подходит, сессия восстанавливается. Все работает!
  • #46 С эти же тикетом идем к haproxy Ключ такой же. Смотрим - восстановится ли сессия?
  • #47 Но тикет уже не подходит. Тикет будет портится. Мы стали изучать вопрос с двух сторон: серверной и клиентской.
  • #48 Фронт
  • #49 APP создает сессию
  • #50 Тикет Отдает клиенту
  • #51 При запуску устанавливается
  • #52 Начинает добавляться в новые сессии
  • #53 Проверяет совпадение Ни где не используется Зачем так?...
  • #54 Специально сломано Везде
  • #55 Из описания ф-ции openssl Да, специально
  • #56 В популярном софте
  • #57 С сервером разобрались. А что же клиент? Упустили...
  • #58 Как ассоциирует? В rfc5077 ничего про это нет. Посмотрели код браузеров...
  • #59 Банально Не значит, что в др. клиентах так Вывод...
  • #60 Теоретически - да, клиент сам разрулит. Практически - лучше не надо Вписаться в рамки стандарта.
  • #61 Уже понизили Но не скомпенсировали на 100% Что еще? AVX...
  • #62 расширение системы команд x86 - различные улучшения, новые инструкции Уже сейчас есть AVX512
  • #63 Почти год назад появилась LTS-версия 1.0.2. В популярных пока нет, придется собирать самим. Но частые дыры в openssl. Стоит ли овчинка выделки?
  • #64 Итого спасли 35%. Это почти полная компенсация TLS. AVX2 еще больше даст - 30% Не могу дать до HTTPS - у нас частые изменения Если упадет ЦОД - ЗАПАС
  • #65 CPU & RTT - OK На чем бы еще выиграть для пользователя? Есть на чем
  • #66 Напомню как устроена PKI. Есть CA
  • #67 Он выпустил сертификаты
  • #68 Один из сертификатов - это серт. на нашем сайте CA - инсталлирован в браузер
  • #69 Браузер приходит к web-сайту
  • #70 И проверяет... Это все очевидно… На долго - год - ½ года,...
  • #71 Но что если сертификат был отозван недавно?
  • #72 Браузер взаимодействует с CA и спрашивает у него статус сертификата
  • #73 Для этого есть протокол OCSP. Ответ подписан на стороне CA. А пользователь ждет!
  • #74 Ответ подписан Мы можем скэшировать его у себя и отдавать клиенту
  • #75 Это называется OCSP Stapling. Какой профит?
  • #76 Стоит ли поддерживать весь этот механизм?
  • #77 Firefox Много это или мало?
  • #78 Сама страница отдается за 200 ms, т.е. задержка +25% Справедливости ради: только первое обращение к серверу, браузер кэширует. Профит есть, но...
  • #79 Есть профит Но есть боль. Есть время жизни
  • #80 Разные браузеры переживут по разному: Opera & Firefox сломаются.
  • #81 Не контролируем CA
  • #82 Это точно придется делать
  • #83 Вот недавно
  • #84 Что делать? Вообще лучши уметь откл. все. Mixed Content….
  • #85 Напомню, он бывает двух типов...
  • #86 Active - имеет доступ ко всей странице (DOM) Passive - только к той части где отображается
  • #87 Не контролируем и не можем посмотреть
  • #88 Например баннерная сеть отдает баннер, внутри MC и это не их баннер.
  • #89 Типичный MC. Желтое - warning Красное - какой-то отчет, что за отчет...
  • #90 Задает браузеру политику откуда какие ресурсы можно загружать.
  • #91 Его собрат Атрибут с адресом
  • #92 Туда POST’ом прилетают такие отчеты
  • #93 Мусор Мы его фильтруем Что делаем с отчетами?
  • #94 Мониторим Автоматика
  • #95 Все работает, все зеленое Догадывались, что будут интересные моменты
  • #96 Они сломались
  • #97 Раньше криптостойким был ключ длиной 1024
  • #98 Сейчас 2048 Старые смартфоны просто так не умеют
  • #99 Многие используют браузер в SmartTV. Он стал сильно тормозить. Сделали искл. по UA для этих кейсов - не редиректим.
  • #100 СП засыпало жалобами Не авторизация Как думаете что было?
  • #101 Просто чтобы вписаться в стандарты
  • #102 Весьма опасная штука Примеры приводил
  • #103 Работает, но мусор
  • #104 Кто-то сломается
  • #105 Придется помогать пользователям
  • #106 Надеюсь было интересно и полезно. Готов ответить на вопросы.