Path: blob/main/xml/ru/docs/http/configuring_https_servers.xml
1 views
<!--1Copyright (C) Igor Sysoev2Copyright (C) Nginx, Inc.3-->45<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">67<article name="Настройка HTTPS-серверов"8link="/ru/docs/http/configuring_https_servers.html"9lang="ru"10rev="19"11author="Игорь Сысоев"12editor="Brian Mercer">1314<section>1516<para>17Чтобы настроить HTTPS-сервер, необходимо включить параметр18<literal>ssl</literal> на19<link doc="ngx_http_core_module.xml" id="listen">слушающих сокетах</link>20в блоке <link doc="ngx_http_core_module.xml" id="server"/>,21а также указать местоположение файлов с22<link doc="ngx_http_ssl_module.xml" id="ssl_certificate">сертификатом сервера</link>23и24<link doc="ngx_http_ssl_module.xml" id="ssl_certificate_key">секретным ключом</link>:2526<programlisting>27server {28listen 443 <b>ssl</b>;29server_name www.example.com;30ssl_certificate <b>www.example.com.crt</b>;31ssl_certificate_key <b>www.example.com.key</b>;32ssl_protocols TLSv1.2 TLSv1.3;33ssl_ciphers HIGH:!aNULL:!MD5;34...35}36</programlisting>3738Сертификат сервера является публичным.39Он посылается каждому клиенту, соединяющемуся с сервером.40Секретный ключ следует хранить в файле с ограниченным доступом41(права доступа должны позволять главному процессу nginx читать этот файл).42Секретный ключ можно также хранить в одном файле с сертификатом:4344<programlisting>45ssl_certificate www.example.com.cert;46ssl_certificate_key www.example.com.cert;47</programlisting>4849при этом права доступа к файлу следует также ограничить.50Несмотря на то, что и сертификат, и ключ хранятся в одном файле,51клиенту посылается только сертификат.52</para>5354<para>55С помощью директив <link doc="ngx_http_ssl_module.xml" id="ssl_protocols"/> и56<link doc="ngx_http_ssl_module.xml" id="ssl_ciphers"/>57можно ограничить соединения58использованием только “сильных” версий и шифров SSL/TLS.59По умолчанию nginx использует60“<literal>ssl_protocols TLSv1.2 TLSv1.3</literal>” и61“<literal>ssl_ciphers HIGH:!aNULL:!MD5</literal>”,62поэтому их явная настройка в общем случае не требуется.63Следует отметить, что значения по умолчанию этих директив несколько раз64<link id="compatibility">менялись</link>.65</para>6667</section>686970<section id="optimization" name="Оптимизация HTTPS-сервера">7172<para>73SSL-операции потребляют дополнительные ресурсы процессора.74На мультипроцессорных системах следует запускать несколько75<link doc="../ngx_core_module.xml" id="worker_processes">рабочих процессов</link>,76не меньше числа доступных процессорных ядер.77Наиболее ресурсоёмкой для процессора является операция SSL handshake, в рамках78которой формируются криптографические параметры сессии.79Существует два способа уменьшения числа этих операций, производимых для каждого80клиента: использование постоянных81(<link doc="ngx_http_core_module.xml" id="keepalive_timeout">keepalive</link>)82соединений, позволяющих в рамках83одного соединения обрабатывать сразу несколько запросов, и повторное84использование параметров SSL-сессии для предотвращения необходимости выполнения85SSL handshake для параллельных и последующих соединений.86Сессии хранятся в кэше SSL-сессий, разделяемом между рабочими процессами и87настраиваемом директивой88<link doc="ngx_http_ssl_module.xml" id="ssl_session_cache"/>.89В 1 мегабайт кэша помещается около 4000 сессий.90Таймаут кэша по умолчанию равен 5 минутам.91Он может быть увеличен с помощью директивы92<link doc="ngx_http_ssl_module.xml" id="ssl_session_timeout"/>.93Вот пример конфигурации, оптимизированной под многоядерную систему94с 10-мегабайтным разделяемым кэшем сессий:9596<programlisting>97<b>worker_processes auto</b>;9899http {100<b>ssl_session_cache shared:SSL:10m</b>;101<b>ssl_session_timeout 10m</b>;102103server {104listen 443 ssl;105server_name www.example.com;106<b>keepalive_timeout 70</b>;107108ssl_certificate www.example.com.crt;109ssl_certificate_key www.example.com.key;110ssl_protocols TLSv1.2 TLSv1.3;111ssl_ciphers HIGH:!aNULL:!MD5;112...113</programlisting>114</para>115116</section>117118119<section id="chains" name="Цепочки SSL-сертификатов">120121<para>122Некоторые браузеры могут выдавать предупреждение о сертификате, подписанном123общеизвестным центром сертификации, в то время как другие браузеры без124проблем принимают этот же сертификат.125Так происходит потому, что центр, выдавший сертификат, подписал его126промежуточным сертификатом, которого нет в базе данных сертификатов127общеизвестных доверенных центров сертификации, распространяемой128вместе с браузером.129В подобном случае центр сертификации предоставляет “связку” сертификатов,130которую следует присоединить к сертификату сервера.131Сертификат сервера следует разместить перед связкой сертификатов132в скомбинированном файле:133134<programlisting>135$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt136</programlisting>137138Полученный файл следует указать в директиве139<link doc="ngx_http_ssl_module.xml" id="ssl_certificate"/>:140141<programlisting>142server {143listen 443 ssl;144server_name www.example.com;145ssl_certificate www.example.com.chained.crt;146ssl_certificate_key www.example.com.key;147...148}149</programlisting>150151Если сертификат сервера и связка сертификатов были соединены в неправильном152порядке, nginx откажется запускаться и выдаст сообщение об ошибке:153154<programlisting>155SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed156(SSL: error:05800074:x509 certificate routines::key values mismatch)157</programlisting>158159поскольку nginx попытается использовать секретный ключ с первым160сертификатом из связки вместо сертификата сервера.161</para>162163<para>164Браузеры обычно сохраняют полученные промежуточные сертификаты, подписанные165доверенными центрами сертификации, поэтому активно используемые браузеры166уже могут иметь требуемые промежуточные сертификаты и не выдать предупреждение167о сертификате, присланном без связанной с ним цепочки сертификатов.168Убедиться в том, что сервер присылает полную цепочку сертификатов,169можно при помощи утилиты командной строки <command>openssl</command>, например:170171<programlisting>172$ openssl s_client -connect www.godaddy.com:443173...174Certificate chain1750 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US176/1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc177/OU=MIS Department/<b>CN=www.GoDaddy.com</b>178/serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)179i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.180/OU=http://certificates.godaddy.com/repository181/CN=Go Daddy Secure Certification Authority182/serialNumber=079692871831 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.184/OU=http://certificates.godaddy.com/repository185/CN=Go Daddy Secure Certification Authority186/serialNumber=07969287187i:/C=US/O=The Go Daddy Group, Inc.188/OU=Go Daddy Class 2 Certification Authority1892 s:/C=US/O=The Go Daddy Group, Inc.190/OU=Go Daddy Class 2 Certification Authority191i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>192/OU=ValiCert Class 2 Policy Validation Authority193/CN=http://www.valicert.com//[email protected]194...195</programlisting>196197В этом примере субъект (“<i>s</i>”) сертификата №0 сервера198<literal>www.GoDaddy.com</literal> подписан издателем (“<i>i</i>”),199который в свою очередь является субъектом сертификата №1, подписанного200издателем, который в свою очередь является субъектом сертификата №2,201подписанного общеизвестным издателем <i>ValiCert, Inc.</i>,202чей сертификат хранится во встроенной в браузеры базе данных203сертификатов (которая в тёмном чулане хранится в доме, который построил Джек).204</para>205206<para>207Если связку сертификатов не добавили, будет показан только сертификат208сервера №0.209</para>210211</section>212213214<section id="single_http_https_server" name="Единый HTTP/HTTPS сервер">215216<para>217Можно настроить единый сервер, который обслуживает как HTTP-,218так и HTTPS-запросы:219220<programlisting>221server {222listen 80;223listen 443 ssl;224server_name www.example.com;225ssl_certificate www.example.com.crt;226ssl_certificate_key www.example.com.key;227...228}229</programlisting>230231<note>232До версии 0.7.14 SSL нельзя было включить выборочно для233отдельных слущающих сокетов, как показано выше.234SSL можно было включить только для всего сервера целиком,235с помощью директивы <link doc="ngx_http_ssl_module.xml" id="ssl"/>,236что не позволяло настроить единый HTTP/HTTPS сервер.237Для решения этой задачи был добавлен238параметр <literal>ssl</literal>239директивы <link doc="ngx_http_core_module.xml" id="listen"/>.240Поэтому использование241директивы <link doc="ngx_http_ssl_module.xml" id="ssl"/>242в современных версиях не рекомендуется;243директива упразднена в 1.25.1.244</note>245</para>246247</section>248249250<section id="name_based_https_servers" name="Выбор HTTPS-сервера по имени">251252<para>253Типичная проблема возникает при настройке двух и более серверов HTTPS,254слушающих на одном и том же IP-адресе:255256<programlisting>257server {258listen 443 ssl;259server_name www.example.com;260ssl_certificate www.example.com.crt;261...262}263264server {265listen 443 ssl;266server_name www.example.org;267ssl_certificate www.example.org.crt;268...269}270</programlisting>271272В такой конфигурации браузер получит сертификат сервера по умолчанию, т.е.273<literal>www.example.com</literal>, независимо от запрашиваемого имени сервера.274Это связано с поведением протокола SSL.275SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос,276и nginx не знает имени запрашиваемого сервера.277Следовательно, он лишь может предложить сертификат сервера по умолчанию.278</para>279280<para>281Наиболее старым и надёжным способом решения этой проблемы282является назначение каждому HTTPS-серверу своего IP-адреса:283284<programlisting>285server {286listen 192.168.1.1:443 ssl;287server_name www.example.com;288ssl_certificate www.example.com.crt;289...290}291292server {293listen 192.168.1.2:443 ssl;294server_name www.example.org;295ssl_certificate www.example.org.crt;296...297}298</programlisting>299</para>300301302<section id="certificate_with_several_names"303name="SSL-сертификат с несколькими именами">304305<para>306Существуют и другие способы, которые позволяют использовать один и тот же307IP-адрес сразу для нескольких HTTPS-серверов.308Все они, однако, имеют свои недостатки.309Одним из таких способов является использование сертификата с несколькими310именами в поле SubjectAltName сертификата, например311<literal>www.example.com</literal> и <literal>www.example.org</literal>.312Однако, длина поля SubjectAltName ограничена.313</para>314315<para>316Другим способом является использование wildcard-сертификата, например317<literal>*.example.org</literal>.318Такой сертификат защищает все поддомены указанного домена, но только319на заданном уровне.320Под такой сертификат подходит <literal>www.example.org</literal>, но не подходят321<literal>example.org</literal> и <literal>www.sub.example.org</literal>.322Два вышеуказанных способа можно комбинировать.323Сертификат может одновременно содержать и точное, и wildcard имена в поле324SubjectAltName, например325<literal>example.org</literal> и <literal>*.example.org</literal>.326</para>327328<para>329Лучше поместить сведения о файле сертификата с несколькими именами и330файле с его секретным ключом на уровне конфигурации <i>http</i>, чтобы331все серверы унаследовали их единственную копию в памяти:332333<programlisting>334ssl_certificate common.crt;335ssl_certificate_key common.key;336337server {338listen 443 ssl;339server_name www.example.com;340...341}342343server {344listen 443 ssl;345server_name www.example.org;346...347}348</programlisting>349</para>350351</section>352353354<section id="sni" name="Указание имени сервера">355356<para>357Более общее решение для работы нескольких HTTPS-серверов на одном358IP-адресе —359<link url="http://en.wikipedia.org/wiki/Server_Name_Indication">расширение360Server Name Indication протокола TLS</link> (SNI, RFC 6066),361которое позволяет браузеру передать запрашиваемое имя сервера во время362SSL handshake, а значит сервер будет знать, какой сертификат ему363следует использовать для соединения.364Сейчас SNI365<link url="http://en.wikipedia.org/wiki/Server_Name_Indication#Support">поддерживается</link>366большинством современных браузеров367и является обязательным расширением в TLSv1.3,368однако может не использоваться некоторыми369старыми или специализированными клиентами.370<note>371В SNI можно передавать только доменные имена,372однако некоторые браузеры могут ошибочно передавать IP-адрес сервера373в качестве его имени, если в запросе указан IP-адрес.374Полагаться на это не следует.375</note>376</para>377378<para>379Чтобы использовать SNI в nginx, соответствующая поддержка должна380присутствовать как в библиотеке OpenSSL, использованной при сборке381бинарного файла nginx, так и в библиотеке, подгружаемой в момент работы.382OpenSSL поддерживает SNI начиная с версии 0.9.8f, если она была383собрана с опцией конфигурации <nobr>“--enable-tlsext”.</nobr>384Начиная с OpenSSL 0.9.8j эта опция включена по умолчанию.385Если nginx был собран с поддержкой SNI, то при запуске nginx с ключом386“-V” об этом сообщается:387388<programlisting>389$ nginx -V390...391TLS SNI support enabled392...393</programlisting>394395Однако если nginx, собранный с поддержкой SNI, в процессе работы подгружает396библиотеку OpenSSL, в которой нет поддержки SNI, nginx выдаёт предупреждение:397398<programlisting>399nginx was built with SNI support, however, now it is linked400dynamically to an OpenSSL library which has no tlsext support,401therefore SNI is not available402</programlisting>403</para>404405</section>406407</section>408409410<section id="compatibility" name="Совместимость">411412<para>413<list type="bullet">414415<listitem>416Статус поддержки SNI отображается по ключу “-V”417начиная с версий 0.8.21 и 0.7.62.418</listitem>419420<listitem>421Параметр <literal>ssl</literal> директивы422<link doc="ngx_http_core_module.xml" id="listen"/>423поддерживается начиная с версии 0.7.14.424До версии 0.8.21 его можно было указывать только совместно с425параметром <literal>default</literal>.426</listitem>427428<listitem>429SNI поддерживается начиная с версии 0.5.23.430</listitem>431432<listitem>433Разделяемый кэш SSL-сессий поддерживается начиная с версии 0.5.6.434</listitem>435436</list>437</para>438439<para>440<list type="bullet">441442<listitem>443Версия 1.27.3 и более поздние: протоколами SSL по умолчанию являются444TLSv1.2 и TLSv1.3 (если поддерживается библиотекой OpenSSL).445В противном случае, при использовании OpenSSL 1.0.0 и более старых версий,446протоколами SSL по умолчанию являются TLSv1 и TLSv1.1.447</listitem>448449<listitem>450Версия 1.23.4 и более поздние: протоколами SSL по умолчанию являются451TLSv1, TLSv1.1, TLSv1.2 и TLSv1.3 (если поддерживается библиотекой OpenSSL).452</listitem>453454<listitem>455Версия 1.9.1 и более поздние: протоколами SSL по умолчанию являются456TLSv1, TLSv1.1 и TLSv1.2 (если поддерживается библиотекой OpenSSL).457</listitem>458459<listitem>460Версия 0.7.65, 0.8.19 и более поздние: протоколами SSL по умолчанию являются461SSLv3, TLSv1, TLSv1.1 и TLSv1.2 (если поддерживается библиотекой OpenSSL).462</listitem>463464<listitem>465Версия 0.7.64, 0.8.18 и более ранние: протоколами SSL по умолчанию являются466SSLv2, SSLv3 и TLSv1.467</listitem>468469</list>470</para>471472<para>473<list type="bullet">474475<listitem>476Версия 1.0.5 и более поздние: шифрами SSL по умолчанию являются477“<literal>HIGH:!aNULL:!MD5</literal>”.478</listitem>479480<listitem>481Версия 0.7.65, 0.8.20 и более поздние: шифрами SSL по умолчанию являются482“<literal>HIGH:!ADH:!MD5</literal>”.483</listitem>484485<listitem>486Версия 0.8.19: шифрами SSL по умолчанию являются487“<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM</literal>”.488</listitem>489490<listitem>491Версия 0.7.64, 0.8.18 и более ранние: шифрами SSL по умолчанию являются<br/>492“<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP</literal>”.493</listitem>494495</list>496</para>497498499</section>500501502</article>503504505