Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ru/docs/http/configuring_https_servers.xml
1 views
1
<!--
2
Copyright (C) Igor Sysoev
3
Copyright (C) Nginx, Inc.
4
-->
5
6
<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
7
8
<article name="Настройка HTTPS-серверов"
9
link="/ru/docs/http/configuring_https_servers.html"
10
lang="ru"
11
rev="19"
12
author="Игорь Сысоев"
13
editor="Brian Mercer">
14
15
<section>
16
17
<para>
18
Чтобы настроить HTTPS-сервер, необходимо включить параметр
19
<literal>ssl</literal> на
20
<link doc="ngx_http_core_module.xml" id="listen">слушающих сокетах</link>
21
в блоке <link doc="ngx_http_core_module.xml" id="server"/>,
22
а также указать местоположение файлов с
23
<link doc="ngx_http_ssl_module.xml" id="ssl_certificate">сертификатом сервера</link>
24
и
25
<link doc="ngx_http_ssl_module.xml" id="ssl_certificate_key">секретным ключом</link>:
26
27
<programlisting>
28
server {
29
listen 443 <b>ssl</b>;
30
server_name www.example.com;
31
ssl_certificate <b>www.example.com.crt</b>;
32
ssl_certificate_key <b>www.example.com.key</b>;
33
ssl_protocols TLSv1.2 TLSv1.3;
34
ssl_ciphers HIGH:!aNULL:!MD5;
35
...
36
}
37
</programlisting>
38
39
Сертификат сервера является публичным.
40
Он посылается каждому клиенту, соединяющемуся с сервером.
41
Секретный ключ следует хранить в файле с ограниченным доступом
42
(права доступа должны позволять главному процессу nginx читать этот файл).
43
Секретный ключ можно также хранить в одном файле с сертификатом:
44
45
<programlisting>
46
ssl_certificate www.example.com.cert;
47
ssl_certificate_key www.example.com.cert;
48
</programlisting>
49
50
при этом права доступа к файлу следует также ограничить.
51
Несмотря на то, что и сертификат, и ключ хранятся в одном файле,
52
клиенту посылается только сертификат.
53
</para>
54
55
<para>
56
С помощью директив <link doc="ngx_http_ssl_module.xml" id="ssl_protocols"/> и
57
<link doc="ngx_http_ssl_module.xml" id="ssl_ciphers"/>
58
можно ограничить соединения
59
использованием только “сильных” версий и шифров SSL/TLS.
60
По умолчанию nginx использует
61
<literal>ssl_protocols TLSv1.2 TLSv1.3</literal>” и
62
<literal>ssl_ciphers HIGH:!aNULL:!MD5</literal>”,
63
поэтому их явная настройка в общем случае не требуется.
64
Следует отметить, что значения по умолчанию этих директив несколько раз
65
<link id="compatibility">менялись</link>.
66
</para>
67
68
</section>
69
70
71
<section id="optimization" name="Оптимизация HTTPS-сервера">
72
73
<para>
74
SSL-операции потребляют дополнительные ресурсы процессора.
75
На мультипроцессорных системах следует запускать несколько
76
<link doc="../ngx_core_module.xml" id="worker_processes">рабочих процессов</link>,
77
не меньше числа доступных процессорных ядер.
78
Наиболее ресурсоёмкой для процессора является операция SSL handshake, в рамках
79
которой формируются криптографические параметры сессии.
80
Существует два способа уменьшения числа этих операций, производимых для каждого
81
клиента: использование постоянных
82
(<link doc="ngx_http_core_module.xml" id="keepalive_timeout">keepalive</link>)
83
соединений, позволяющих в рамках
84
одного соединения обрабатывать сразу несколько запросов, и повторное
85
использование параметров SSL-сессии для предотвращения необходимости выполнения
86
SSL handshake для параллельных и последующих соединений.
87
Сессии хранятся в кэше SSL-сессий, разделяемом между рабочими процессами и
88
настраиваемом директивой
89
<link doc="ngx_http_ssl_module.xml" id="ssl_session_cache"/>.
90
В 1 мегабайт кэша помещается около 4000 сессий.
91
Таймаут кэша по умолчанию равен 5 минутам.
92
Он может быть увеличен с помощью директивы
93
<link doc="ngx_http_ssl_module.xml" id="ssl_session_timeout"/>.
94
Вот пример конфигурации, оптимизированной под многоядерную систему
95
с 10-мегабайтным разделяемым кэшем сессий:
96
97
<programlisting>
98
<b>worker_processes auto</b>;
99
100
http {
101
<b>ssl_session_cache shared:SSL:10m</b>;
102
<b>ssl_session_timeout 10m</b>;
103
104
server {
105
listen 443 ssl;
106
server_name www.example.com;
107
<b>keepalive_timeout 70</b>;
108
109
ssl_certificate www.example.com.crt;
110
ssl_certificate_key www.example.com.key;
111
ssl_protocols TLSv1.2 TLSv1.3;
112
ssl_ciphers HIGH:!aNULL:!MD5;
113
...
114
</programlisting>
115
</para>
116
117
</section>
118
119
120
<section id="chains" name="Цепочки SSL-сертификатов">
121
122
<para>
123
Некоторые браузеры могут выдавать предупреждение о сертификате, подписанном
124
общеизвестным центром сертификации, в то время как другие браузеры без
125
проблем принимают этот же сертификат.
126
Так происходит потому, что центр, выдавший сертификат, подписал его
127
промежуточным сертификатом, которого нет в базе данных сертификатов
128
общеизвестных доверенных центров сертификации, распространяемой
129
вместе с браузером.
130
В подобном случае центр сертификации предоставляет “связку” сертификатов,
131
которую следует присоединить к сертификату сервера.
132
Сертификат сервера следует разместить перед связкой сертификатов
133
в скомбинированном файле:
134
135
<programlisting>
136
$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt
137
</programlisting>
138
139
Полученный файл следует указать в директиве
140
<link doc="ngx_http_ssl_module.xml" id="ssl_certificate"/>:
141
142
<programlisting>
143
server {
144
listen 443 ssl;
145
server_name www.example.com;
146
ssl_certificate www.example.com.chained.crt;
147
ssl_certificate_key www.example.com.key;
148
...
149
}
150
</programlisting>
151
152
Если сертификат сервера и связка сертификатов были соединены в неправильном
153
порядке, nginx откажется запускаться и выдаст сообщение об ошибке:
154
155
<programlisting>
156
SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
157
(SSL: error:05800074:x509 certificate routines::key values mismatch)
158
</programlisting>
159
160
поскольку nginx попытается использовать секретный ключ с первым
161
сертификатом из связки вместо сертификата сервера.
162
</para>
163
164
<para>
165
Браузеры обычно сохраняют полученные промежуточные сертификаты, подписанные
166
доверенными центрами сертификации, поэтому активно используемые браузеры
167
уже могут иметь требуемые промежуточные сертификаты и не выдать предупреждение
168
о сертификате, присланном без связанной с ним цепочки сертификатов.
169
Убедиться в том, что сервер присылает полную цепочку сертификатов,
170
можно при помощи утилиты командной строки <command>openssl</command>, например:
171
172
<programlisting>
173
$ openssl s_client -connect www.godaddy.com:443
174
...
175
Certificate chain
176
0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US
177
/1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc
178
/OU=MIS Department/<b>CN=www.GoDaddy.com</b>
179
/serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)
180
i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
181
/OU=http://certificates.godaddy.com/repository
182
/CN=Go Daddy Secure Certification Authority
183
/serialNumber=07969287
184
1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
185
/OU=http://certificates.godaddy.com/repository
186
/CN=Go Daddy Secure Certification Authority
187
/serialNumber=07969287
188
i:/C=US/O=The Go Daddy Group, Inc.
189
/OU=Go Daddy Class 2 Certification Authority
190
2 s:/C=US/O=The Go Daddy Group, Inc.
191
/OU=Go Daddy Class 2 Certification Authority
192
i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>
193
/OU=ValiCert Class 2 Policy Validation Authority
194
/CN=http://www.valicert.com//[email protected]
195
...
196
</programlisting>
197
198
В этом примере субъект (“<i>s</i>”) сертификата №0 сервера
199
<literal>www.GoDaddy.com</literal> подписан издателем (“<i>i</i>”),
200
который в свою очередь является субъектом сертификата №1, подписанного
201
издателем, который в свою очередь является субъектом сертификата №2,
202
подписанного общеизвестным издателем <i>ValiCert, Inc.</i>,
203
чей сертификат хранится во встроенной в браузеры базе данных
204
сертификатов (которая в тёмном чулане хранится в доме, который построил Джек).
205
</para>
206
207
<para>
208
Если связку сертификатов не добавили, будет показан только сертификат
209
сервера №0.
210
</para>
211
212
</section>
213
214
215
<section id="single_http_https_server" name="Единый HTTP/HTTPS сервер">
216
217
<para>
218
Можно настроить единый сервер, который обслуживает как HTTP-,
219
так и HTTPS-запросы:
220
221
<programlisting>
222
server {
223
listen 80;
224
listen 443 ssl;
225
server_name www.example.com;
226
ssl_certificate www.example.com.crt;
227
ssl_certificate_key www.example.com.key;
228
...
229
}
230
</programlisting>
231
232
<note>
233
До версии 0.7.14 SSL нельзя было включить выборочно для
234
отдельных слущающих сокетов, как показано выше.
235
SSL можно было включить только для всего сервера целиком,
236
с помощью директивы <link doc="ngx_http_ssl_module.xml" id="ssl"/>,
237
что не позволяло настроить единый HTTP/HTTPS сервер.
238
Для решения этой задачи был добавлен
239
параметр <literal>ssl</literal>
240
директивы <link doc="ngx_http_core_module.xml" id="listen"/>.
241
Поэтому использование
242
директивы <link doc="ngx_http_ssl_module.xml" id="ssl"/>
243
в современных версиях не рекомендуется;
244
директива упразднена в 1.25.1.
245
</note>
246
</para>
247
248
</section>
249
250
251
<section id="name_based_https_servers" name="Выбор HTTPS-сервера по имени">
252
253
<para>
254
Типичная проблема возникает при настройке двух и более серверов HTTPS,
255
слушающих на одном и том же IP-адресе:
256
257
<programlisting>
258
server {
259
listen 443 ssl;
260
server_name www.example.com;
261
ssl_certificate www.example.com.crt;
262
...
263
}
264
265
server {
266
listen 443 ssl;
267
server_name www.example.org;
268
ssl_certificate www.example.org.crt;
269
...
270
}
271
</programlisting>
272
273
В такой конфигурации браузер получит сертификат сервера по умолчанию, т.е.
274
<literal>www.example.com</literal>, независимо от запрашиваемого имени сервера.
275
Это связано с поведением протокола SSL.
276
SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос,
277
и nginx не знает имени запрашиваемого сервера.
278
Следовательно, он лишь может предложить сертификат сервера по умолчанию.
279
</para>
280
281
<para>
282
Наиболее старым и надёжным способом решения этой проблемы
283
является назначение каждому HTTPS-серверу своего IP-адреса:
284
285
<programlisting>
286
server {
287
listen 192.168.1.1:443 ssl;
288
server_name www.example.com;
289
ssl_certificate www.example.com.crt;
290
...
291
}
292
293
server {
294
listen 192.168.1.2:443 ssl;
295
server_name www.example.org;
296
ssl_certificate www.example.org.crt;
297
...
298
}
299
</programlisting>
300
</para>
301
302
303
<section id="certificate_with_several_names"
304
name="SSL-сертификат с несколькими именами">
305
306
<para>
307
Существуют и другие способы, которые позволяют использовать один и тот же
308
IP-адрес сразу для нескольких HTTPS-серверов.
309
Все они, однако, имеют свои недостатки.
310
Одним из таких способов является использование сертификата с несколькими
311
именами в поле SubjectAltName сертификата, например
312
<literal>www.example.com</literal> и <literal>www.example.org</literal>.
313
Однако, длина поля SubjectAltName ограничена.
314
</para>
315
316
<para>
317
Другим способом является использование wildcard-сертификата, например
318
<literal>*.example.org</literal>.
319
Такой сертификат защищает все поддомены указанного домена, но только
320
на заданном уровне.
321
Под такой сертификат подходит <literal>www.example.org</literal>, но не подходят
322
<literal>example.org</literal> и <literal>www.sub.example.org</literal>.
323
Два вышеуказанных способа можно комбинировать.
324
Сертификат может одновременно содержать и точное, и wildcard имена в поле
325
SubjectAltName, например
326
<literal>example.org</literal> и <literal>*.example.org</literal>.
327
</para>
328
329
<para>
330
Лучше поместить сведения о файле сертификата с несколькими именами и
331
файле с его секретным ключом на уровне конфигурации <i>http</i>, чтобы
332
все серверы унаследовали их единственную копию в памяти:
333
334
<programlisting>
335
ssl_certificate common.crt;
336
ssl_certificate_key common.key;
337
338
server {
339
listen 443 ssl;
340
server_name www.example.com;
341
...
342
}
343
344
server {
345
listen 443 ssl;
346
server_name www.example.org;
347
...
348
}
349
</programlisting>
350
</para>
351
352
</section>
353
354
355
<section id="sni" name="Указание имени сервера">
356
357
<para>
358
Более общее решение для работы нескольких HTTPS-серверов на одном
359
IP-адресе —
360
<link url="http://en.wikipedia.org/wiki/Server_Name_Indication">расширение
361
Server Name Indication протокола TLS</link> (SNI, RFC 6066),
362
которое позволяет браузеру передать запрашиваемое имя сервера во время
363
SSL handshake, а значит сервер будет знать, какой сертификат ему
364
следует использовать для соединения.
365
Сейчас SNI
366
<link url="http://en.wikipedia.org/wiki/Server_Name_Indication#Support">поддерживается</link>
367
большинством современных браузеров
368
и является обязательным расширением в TLSv1.3,
369
однако может не использоваться некоторыми
370
старыми или специализированными клиентами.
371
<note>
372
В SNI можно передавать только доменные имена,
373
однако некоторые браузеры могут ошибочно передавать IP-адрес сервера
374
в качестве его имени, если в запросе указан IP-адрес.
375
Полагаться на это не следует.
376
</note>
377
</para>
378
379
<para>
380
Чтобы использовать SNI в nginx, соответствующая поддержка должна
381
присутствовать как в библиотеке OpenSSL, использованной при сборке
382
бинарного файла nginx, так и в библиотеке, подгружаемой в момент работы.
383
OpenSSL поддерживает SNI начиная с версии 0.9.8f, если она была
384
собрана с опцией конфигурации <nobr>“--enable-tlsext”.</nobr>
385
Начиная с OpenSSL 0.9.8j эта опция включена по умолчанию.
386
Если nginx был собран с поддержкой SNI, то при запуске nginx с ключом
387
“-V” об этом сообщается:
388
389
<programlisting>
390
$ nginx -V
391
...
392
TLS SNI support enabled
393
...
394
</programlisting>
395
396
Однако если nginx, собранный с поддержкой SNI, в процессе работы подгружает
397
библиотеку OpenSSL, в которой нет поддержки SNI, nginx выдаёт предупреждение:
398
399
<programlisting>
400
nginx was built with SNI support, however, now it is linked
401
dynamically to an OpenSSL library which has no tlsext support,
402
therefore SNI is not available
403
</programlisting>
404
</para>
405
406
</section>
407
408
</section>
409
410
411
<section id="compatibility" name="Совместимость">
412
413
<para>
414
<list type="bullet">
415
416
<listitem>
417
Статус поддержки SNI отображается по ключу “-V”
418
начиная с версий 0.8.21 и 0.7.62.
419
</listitem>
420
421
<listitem>
422
Параметр <literal>ssl</literal> директивы
423
<link doc="ngx_http_core_module.xml" id="listen"/>
424
поддерживается начиная с версии 0.7.14.
425
До версии 0.8.21 его можно было указывать только совместно с
426
параметром <literal>default</literal>.
427
</listitem>
428
429
<listitem>
430
SNI поддерживается начиная с версии 0.5.23.
431
</listitem>
432
433
<listitem>
434
Разделяемый кэш SSL-сессий поддерживается начиная с версии 0.5.6.
435
</listitem>
436
437
</list>
438
</para>
439
440
<para>
441
<list type="bullet">
442
443
<listitem>
444
Версия 1.27.3 и более поздние: протоколами SSL по умолчанию являются
445
TLSv1.2 и TLSv1.3 (если поддерживается библиотекой OpenSSL).
446
В противном случае, при использовании OpenSSL 1.0.0 и более старых версий,
447
протоколами SSL по умолчанию являются TLSv1 и TLSv1.1.
448
</listitem>
449
450
<listitem>
451
Версия 1.23.4 и более поздние: протоколами SSL по умолчанию являются
452
TLSv1, TLSv1.1, TLSv1.2 и TLSv1.3 (если поддерживается библиотекой OpenSSL).
453
</listitem>
454
455
<listitem>
456
Версия 1.9.1 и более поздние: протоколами SSL по умолчанию являются
457
TLSv1, TLSv1.1 и TLSv1.2 (если поддерживается библиотекой OpenSSL).
458
</listitem>
459
460
<listitem>
461
Версия 0.7.65, 0.8.19 и более поздние: протоколами SSL по умолчанию являются
462
SSLv3, TLSv1, TLSv1.1 и TLSv1.2 (если поддерживается библиотекой OpenSSL).
463
</listitem>
464
465
<listitem>
466
Версия 0.7.64, 0.8.18 и более ранние: протоколами SSL по умолчанию являются
467
SSLv2, SSLv3 и TLSv1.
468
</listitem>
469
470
</list>
471
</para>
472
473
<para>
474
<list type="bullet">
475
476
<listitem>
477
Версия 1.0.5 и более поздние: шифрами SSL по умолчанию являются
478
<literal>HIGH:!aNULL:!MD5</literal>”.
479
</listitem>
480
481
<listitem>
482
Версия 0.7.65, 0.8.20 и более поздние: шифрами SSL по умолчанию являются
483
<literal>HIGH:!ADH:!MD5</literal>”.
484
</listitem>
485
486
<listitem>
487
Версия 0.8.19: шифрами SSL по умолчанию являются
488
<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM</literal>”.
489
</listitem>
490
491
<listitem>
492
Версия 0.7.64, 0.8.18 и более ранние: шифрами SSL по умолчанию являются<br/>
493
<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP</literal>”.
494
</listitem>
495
496
</list>
497
</para>
498
499
500
</section>
501
502
503
</article>
504
505