В чем разница между сертификатами SAN и SNI SSL?

21

Может ли кто-нибудь объяснить мне разницу между этими сертификатами в упрощенном виде? Я прочитал несколько статей, но похоже, что они выполняют одну и ту же работу, а именно шифруют многие домены одним сертификатом.

AFA Med
источник
11
Ну, во-первых, не существует такого понятия, как SSL-сертификат "SNI".
Майкл Хэмптон

Ответы:

36

SAN (Subject Alternative Name) является частью спецификации сертификата X509 , где у сертификата есть поле со списком альтернативных имен, которые также действительны для субъекта (в дополнение к одному Common Name / CN). Это поле и подстановочные имена - это, по сути, два способа использования одного сертификата для нескольких имен.

SNI (индикация имени сервера) - это расширение протокола TLS, которое является своего рода аналогом протокола TLS заголовка узла HTTP. Когда клиент отправляет это, он позволяет серверу выбрать правильный сертификат для представления клиенту без ограничения использования отдельных IP-адресов на стороне сервера (очень похоже на то, как заголовок узла HTTP интенсивно используется для простого HTTP).

Обратите внимание, что SNI - это не то, что отражено в сертификате, и он фактически является своего рода противоположностью того, о чем просит вопрос; это упрощает наличие множества сертификатов, а не использование одного сертификата для многих вещей.

С другой стороны, это сильно зависит от ситуации, какой путь на самом деле предпочтительнее. В качестве примера, вопрос, который запрашивается, почти наверняка не тот, который вы на самом деле хотите, если вам нужны сертификаты для различных объектов.

Хокан Линдквист
источник
2
Стоит отметить, что CN долгое время считался устаревшим, если имя находится в CN, но не в SAN (или если у сертификата нет поля SAN), многие клиенты будут злиться на вас.
Coderanger
1
@coderanger Если есть поле SAN, поле CN игнорируется большинством клиентов. Если нет поля SAN, поле CN работает с большинством клиентов (и если они злятся на меня, оно не отображается).
kubanczyk
1
Они судят тебя молча.
womble
SNI чем-то похож на виртуальные хосты, где сервер с одним IP-адресом содержит несколько хостов, определенных в конфигурации HTTP? (своего рода мультиплексирование: использование одного IP для нескольких сертификатов вместо каждого сертификата с другим IP, где IPv4 в настоящее время является дефицитным ресурсом)?
Фернандо Габриэли
1
@FernandoGabrieli Да, он позволяет выполнять те же настройки на основе имен на уровне TLS.
Хокан Линдквист
14

SAN расшифровывается как Subject Alternative Name , и это свойство сертификата x509, а SNI - это функция, которую может поддерживать клиент SSL / TLS, таким образом, это совершенно другой объект.

Используя сертификат с SAN, вы можете разместить несколько сайтов с поддержкой HTTPS на одном IP-адресе, даже если клиент не поддерживает SNI . В этом случае у вас есть один сертификат для всех ваших сайтов, и этот сертификат должен содержать все имена сайтов ( ServerNameили их ServerAliasв координатах apache или server_nameв nginx) в качестве его SAN . Это подмножество устаревшего подхода, который расширил «один сайт с поддержкой HTTPS на каждый отдельный IP-адрес». В настоящее время только большие CDN придерживаются SAN .

Используя SNI, вы также можете разместить несколько сайтов с поддержкой HTTPS на одном IP-адресе, у вас есть отдельный сертификат x509 для каждого сайта, и ни в одном из них не упоминаются другие имена сайтов в их свойстве SAN , кроме клиентов TLS (т. Е. Браузеров и консольных клиентов, таких как wgetили curl). должен поддерживать SNI . Это современный подход, поскольку последней операционной системой, не поддерживающей SNI , была Windows XP с IE 6.x, если я правильно помню. В настоящее время вы можете увидеть SAN имущество , если вы покупаете подстановочный сертификат - например , такой сертификат *.foobar.comбудет содержать общее имя из *.foobar.comи SAN из foobar.com.

drookie
источник
1
Технически я не верю, что клиент SSL может поддерживать SNI (насколько мне известно, это расширение TLS, которое никогда не появлялось в SSL).
Хокан Линдквист
3
И SAN, и SNI требуют поддержки клиента. Тем не менее, поскольку SAN существует гораздо дольше, он получил более широкую поддержку.
Касперд
4

Это смешивает две части процесса сертификации.

SAN - это альтернативное имя субъекта. Это способ создать один сертификат для нескольких доменов. Вы просто добавляете другие домены, для которых вы хотите получить сертификат, в поле SAN сертификата. Браузер примет действительность и на этих доменах.

SNI - это указатель имени сервера и является частью SSL. Это позволяет размещать несколько сайтов SSL на одном IP-адресе, поскольку желаемое имя сервера отправляется с рукопожатием SSL, и сервер может выбрать правильный сертификат для ответа.

Кристофер Перрен
источник
0

Вот (возможно) более понятный для человека ответ:

SNI проводится на стороне клиента и сообщает стеку TLS: «Я хочу поговорить с сервером, имя которого - [Сервер X]». Сервер видит эту строку [Server X] и отвечает соответствующим сертификатом. Один практический пример - когда один сервер должен обслуживать трафик для нескольких доменов. Также полезно, если клиент использовал IP (чтобы избежать задержек поиска DNS), но сертификат CN не упоминает IP.

SAN - это список «Также известен как» в сертификатах. Таким образом, сервер может использовать один сертификат для многих имен. Можно добавить несколько доменов к одному сертификату и даже список IP-адресов.

Как видите, все пересекается. Выбор между одним или обоими зависит от того, где человек контролирует. Некоторые клиенты могут не распознавать имена в SAN, и единственный способ адресации заключается в предоставлении соответствующего сертификата на основе SNI. Существуют сценарии, когда сервер предоставляет API для одного сертификата или клиент не отправляет SNI. Для этих случаев SAN является единственным выходом.

Моя компания использует оба. Они обеспечивают гибкость и облегчают обратную и прямую совместимость.

Игорь Гатис
источник