Оптимизация TLS в NGINX

Thank you for reading this post, don't forget to subscribe!

TLS (он же Transport Layer Security) — про­то­кол защи­ты веб-стра­ниц, кото­рый заме­нил собой SSL. По сути TLS = SSL и явля­ет­ся сле­ду­ю­щим поко­ле­ни­ем (вер­си­ей) уста­рев­ше­го и под­вер­жен­но­го POODLE-ата­кам стандарта.

TLS уме­ет не толь­ко шиф­ро­вать дан­ные, но так­же про­во­дить аутен­ти­фи­ка­цию поль­зо­ва­те­лей на сер­ве­ре и про­ве­рять инфор­ма­цию на целост­ность. Про­то­кол обя­за­те­лен к исполь­зо­ва­нию ком­мер­че­ски­ми сай­та­ми и орга­ни­за­ци­я­ми, кото­рые хотят под­твер­дить свою под­лин­ность. Ну и обес­пе­че­ния кон­фи­ден­ци­аль­но­сти пользователей.

Для уста­нов­ки без­опас­но­го кана­ла исполь­зу­ет­ся про­то­кол TLS Handshake, так­же нуж­но полу­чить сер­ти­фи­кат от ЦС и под­гру­зить крип­то­биб­лио­те­ку, OpenSSL в нашем случае.

Для вклю­че­ния TLS и настрой­ки HTTPS-сер­ве­ра в Nginx нуж­но в фай­ле кон­фи­гу­ра­ции в сек­цию server вклю­чить пара­метр SSL:

[codesyntax lang="php"]

[/codesyntax]

# вклю­че­ние SSL на 443 пор­те, ука­за­ние сер­ти­фи­ка­та, клю­ча, про­то­ко­лов TLS и исполь­зу­е­мых шифров

Здесь дирек­ти­ва ssl_protocols огра­ни­чи­ва­ет исполь­зу­е­мые про­то­ко­лы, а ssl_ciphers опи­сы­ва­ет раз­ре­шен­ные шиф­ры в фор­ма­те, под­дер­жи­ва­е­мом биб­лио­те­кой OpenSSL. К примеру:

# при­мер исполь­зо­ва­ния всех шиф­ров в фор­ма­те OpenSSL

Важ­но пони­мать, что опе­ра­ции TLS/SSL доста­точ­но ресур­со­ем­кие, так что даже тре­бу­ет­ся запуск несколь­ких рабо­чих про­цес­сов на муль­ти­про­цес­сор­ных систе­мах. Самой “тяже­лой” и в плане нагруз­ки, и по вре­ме­ни испол­не­ния, явля­ет­ся опе­ра­ция TLS Handshake. Поэто­му луч­шим реше­ни­ем будет опти­ми­за­ция сес­сии: посто­ян­ные соеди­не­ния, кэши­ро­ва­ние, ста­ти­че­ские клю­чи и вклю­че­ние OCSP Stapling.

Keepalive

Исполь­зо­ва­ние посто­ян­ных соеди­не­ний дает воз­мож­ность в усло­ви­ях одно­го под­клю­че­ния обра­ба­ты­вать сра­зу несколь­ко запросов.

Для это­го в сек­цию server фай­ла кон­фи­гу­ра­ции нуж­но добавить:

# вклю­че­ние keepalive

Кэширование сессии

Кэши­ро­ва­ние необ­хо­ди­мо для повтор­но­го исполь­зо­ва­ния клю­чей, что­бы не повто­рять хэндшейк.

Для это­го в сек­ции http фай­ла кон­фи­гу­ра­ции Nginx нуж­но добавить:

# вклю­че­ние обще­го кэша раз­ме­ром 100 МБ и тай­мау­та вре­ме­ни сес­сии 1 час

В 1 МБ кэша поме­ща­ет­ся око­ло 4000 сес­сий, так что пред­став­лен­ный при­мер поз­во­лит хра­нить до 400 000 сессий.

Session Tickets или мандат сессии

Про­то­кол TLS уме­ет исполь­зо­вать session tickets для воз­об­нов­ле­ния сеан­са, при усло­вии, что кли­ент их под­дер­жи­ва­ет (бра­у­зе­ры семей­ства Chromium и Firefox). Для это­го TLS-сер­вер отправ­ля­ет кли­ен­ту состо­я­ние сес­сии (session ticket), шиф­руя его сво­им клю­чом, и иден­ти­фи­ка­тор клю­ча. Кли­ент воз­об­нов­ля­ет защи­щен­ную сес­сию, отправ­ляя послед­ний тикет на сер­вер во вре­мя ини­ци­а­ли­за­ции про­це­ду­ры TLS Handshake. А сер­вер, в свою оче­редь, воз­об­нов­ля­ет сес­сию в соот­вет­ствии с сохра­нен­ны­ми параметрами.TLS session tickets

Реа­ли­зу­ет­ся все очень про­сто. В кон­фи­гу­ра­цию Nginx в уже зна­ко­мой сек­ции server необ­хо­ди­мо добавить:

# вклю­че­ние ста­ти­че­ских ключей

OCSP Stapling

Online Certificate Status Protocol — меха­низм про­вер­ки акту­аль­но­сти сер­ти­фи­ка­та SSL, кото­рый заме­нил менее быст­рый про­то­кол CRL (Certificate Revocation List). При исполь­зо­ва­нии CRL бра­у­зер загру­жа­ет спи­сок анну­ли­ро­ван­ных сер­ти­фи­ка­тов и про­ве­ря­ет теку­щий сер­ти­фи­ка­та, что уве­ли­чи­ва­ет вре­мя под­клю­че­ния. Тогда как при исполь­зо­ва­нии OCSP бра­у­зер отправ­ля­ет про­ве­роч­ный запрос на адрес OCSP и в ответ полу­ча­ет ста­тус сер­ти­фи­ка­та, что может силь­но нагру­жать сер­ве­ра цен­тров сертификации.

Для исполь­зо­ва­ния про­то­ко­ла при­ме­ня­ет­ся OCSP Stapling — вла­де­лец сер­ти­фи­ка­та само­сто­я­тель­но с опре­де­лен­ным интер­ва­лом опра­ши­ва­ет сер­вер OCSP и кэши­ру­ет ответ, кото­рый содер­жит элек­трон­ную под­пись. Сам ответ “сши­ва­ет­ся” с TLS Handshake через рас­ши­ре­ние запро­са Certificate Status Request. Так что на сер­ве­ры цен­тров сер­ти­фи­ка­ции не посту­па­ет огром­ное коли­че­ство запро­сов, кото­рые так­же содер­жат инфор­ма­цию о про­смот­рах пользователя.

Что­бы вклю­чить OCSP Stapling, нуж­но доба­вить несколь­ко стро­чек кода в файл кон­фи­гу­ра­ции Nginx:

# вклю­че­ние OCSP Stapling и под­клю­че­ние дове­рен­но­го сертификата

Дополнительные функции

Для при­ну­ди­тель­но­го исполь­зо­ва­ния бра­у­зе­ром про­то­ко­ла HTTPS суще­ству­ет меха­низм под назва­ни­ем Strict Transport Security:

# вклю­че­ние Strict-Transport-Security, воз­раст в секундах

При помо­щи вот такой функ­ции бра­у­зер будет пони­мать, что нуж­но исполь­зо­вать про­то­кол HTTPS даже пере­хо­дя по ссыл­ке HTTP. Это помо­жет предот­вра­тить часть атак, осо­бен­но, если на сер­ве­ре не уста­нов­лен реди­рект с HTTP на HTTPS.

Самое главное

Опти­ми­за­ция TLS не зай­мет мно­го вре­ме­ни, но помо­жет суще­ствен­но уско­рить рабо­ту про­то­ко­ла и под­клю­че­ния поль­зо­ва­те­лей к защи­щен­ным сай­там. А внед­ре­ние OCSP Stapling и HSTS еще и повы­сит без­опас­ность соединения.