Краткий ответ:
SSL является предшественником TLS. SSL был проприетарным протоколом, разработанным Netscape Communications, позже стандартизированным в IETF и переименованным в TLS. Короче говоря, версии идут в следующем порядке: SSLv2, SSLv3, TLSv1.0, TLSv1.1 и TLSv1.2.
Вопреки относительно распространенному мнению, это вовсе не означает, что нужно запускать службу на отдельном порту с SSL и иметь возможность на том же порту, что и простой текстовый вариант с TLS. И SSL, и TLS могут использоваться для двух подходов. Речь идет о разнице между SSL / TLS при подключении (иногда называемой «неявным SSL / TLS») и SSL / TLS после того, как команда была выполнена на уровне протокола, обычно STARTTLS
(иногда называемой «явным SSL / TLS») , Ключевое слово в STARTTLS
«START», а не TLS. Это сообщение на уровне протокола приложения, указывающее на необходимость переключения на SSL / TLS, если оно не было инициировано до какого-либо обмена протоколом приложения.
Использование любого из этих режимов должно быть эквивалентным при условии, что клиент настроен так или иначе ожидать SSL / TLS, чтобы не понижать его до простого текстового соединения.
Более длинный ответ:
SSL против TLS
Насколько я знаю, SSLv1 никогда не покидал лабораторию. SSLv2 и SSLv3 были протоколами, разработанными Netscape. Некоторое время SSLv2 считался небезопасным, так как подвержен атакам с понижением рейтинга. SSLv3 внутренне использует в (3,0)
качестве номера версии (в ClientHello
сообщении).
TLS является результатом стандартизации как более открытого протокола в IETF. (Мне кажется, я где-то читал, возможно, в книге Э. Резкорлы, что название было выбрано таким образом, что все участники были одинаково недовольны им, чтобы не отдавать предпочтение конкретной компании: это довольно распространенная практика в стандартах body.) Те, кто интересуется тем, как был выполнен переход, могут прочитать FAQ по SSL-Talk List ; существует множество копий этого документа, но большинство ссылок (на ) устарели.netscape.com
TLS использует очень похожие сообщения (достаточно разные, чтобы сделать протоколы несовместимыми, хотя возможно согласование общей версии ). В TLS 1.0 , 1.1 и 1.2 ClientHello
сообщения используют (3,1)
, (3,2)
, (3,3)
чтобы указать номер версии, которая ясно показывает продолжение с SSL.
В этом ответе есть больше деталей о различиях протокола .
Когда я использую что? Когда я не использую какой?
Используйте самую высокую версию, какую только сможете. На практике, как поставщик услуг, это потребует, чтобы у ваших пользователей были клиенты, которые поддерживают эти версии. Как обычно, это всегда упражнение по оценке риска (желательно, при необходимости, с экономическим обоснованием). Как говорится, отключите SSLv2 в любом случае.
Кроме того, обратите внимание, что безопасность, обеспечиваемая SSL / TLS, зависит не только от используемой версии, но и от правильной конфигурации: безусловно, предпочтительнее использовать SSLv3 с набором надежных шифров, чем TLSv1.0 со слабым (или набор шифров анонимного / нулевого шифрования. Некоторые наборы шифров, считающиеся слишком слабыми, были явно запрещены новыми версиями TLS. Таблицы в провайдере Java 7 SunJSSE (и их сноски) могут быть интересны, если вы хотите больше подробностей.
Было бы предпочтительнее использовать хотя бы TLS 1.1, но, к сожалению, не все клиенты их поддерживают (например, Java 6). При использовании версии под 1.1, безусловно, стоит обратить внимание на уменьшение уязвимости BEAST .
В общем, я бы порекомендовал книгу Эрика Рескорлы - SSL и TLS: проектирование и создание защищенных систем, Addison-Wesley, 2001 ISBN 0-201-61598-3, людям, которые действительно хотят больше подробностей.
Неявный против явного SSL / TLS
Существует миф о том, что TLS позволяет использовать один и тот же порт, а SSL - нет. Это просто неправда (и я оставлю объединение портов для этого обсуждения). К сожалению, этот миф, похоже, был распространен среди пользователей тем фактом, что некоторые приложения, такие как MS Outlook, иногда предлагают выбор между SSL и TLS в своих параметрах конфигурации, когда они фактически означают выбор между неявным и явным SSL / TLS. (В Microsoft есть эксперты по SSL / TLS, но, похоже, они не были вовлечены в интерфейс Outlook.)
Я думаю, что причина этого беспорядка - из-за STARTTLS
режима. Некоторые люди, кажется, поняли это как STARTTLS
= TLS, но это не так. Ключевое слово в STARTTLS
«START», а не TLS. Почему это не было вызвано STARTSSL
или STARTSSLORTLS
вызвано тем, что эти расширения были указаны в IETF, который использовал только имена, используемые в его спецификациях (при условии, что имя TLS в конечном итоге будет единственным, я полагаю).
- SSL на том же порту, что и служба простого текста: HTTPS-прокси.
В настоящее время большинство HTTPS-серверов могут обрабатывать TLS, но несколько лет назад большинство людей использовали SSLv3 для HTTPS. HTTPS (строго говоря, стандартизированный как HTTP поверх TLS ) обычно устанавливает соединение SSL / TLS при соединении TCP, а затем обменивается сообщениями HTTP через уровень SSL / TLS. Исключение составляет использование промежуточного прокси-сервера HTTP. В этом случае клиент подключается к HTTP-прокси в незашифрованном виде (обычно через порт 3128), затем выдает команду CONNECT
HTTP и, при условии успешного ответа, инициирует рукопожатие SSL / TLS, отправляяClientHello
сообщение. Все это происходит на одном и том же порту, если речь идет о соединении между браузером и прокси (очевидно, не между прокси и целевым сервером: это даже не одна и та же машина). Это прекрасно работает с SSLv3. Многие из нас в ситуациях, связанных с прокси-сервером, использовали это против серверов, которые не поддерживали хотя бы TLS 1.0.
- SSL на тот же порт, что и текстовая служба: электронная почта.
Этот явно не соответствует спецификациям, но на практике он часто работает. Строго говоря, спецификации говорят о переходе на TLS (не SSL) после использования команды STARTTLS. На практике SSL тоже часто работает (точно так же, как спецификация «HTTP over TLS» также включает использование SSL вместо TLS). Вы можете попробовать это самостоятельно. Предполагая, что у вас есть SMTP или IMAP-сервер, который поддерживает STARTTLS, используйте Thunderbird, зайдите в настройки, дополнительные параметры, редактор настроек и выключите security.enable_tls
. Многие серверы по-прежнему будут принимать соединение, просто потому, что их реализации делегируют уровень SSL / TLS в библиотеку SSL / TLS, которая обычно может обрабатывать SSL и TLS таким же образом, если не настроена на это. Как часто задаваемые вопросы OpenLDAP , "Хотя механизм предназначен для использования с TLSv1, большинство реализаций при необходимости будут использовать SSLv3 (и SSLv2). Msgstr "Если вы не уверены, проверьте с помощью такого инструмента, как Wireshark.
Многие клиенты могут использовать TLS 1.0 (как минимум) для протоколов, где защищенный вариант находится на другом порту. Очевидно, что существует ряд браузеров и веб-серверов, которые поддерживают TLS 1.0 (или выше) для HTTPS. Аналогично, SMTPS, IMAPS, POPS и LDAPS также могут использовать TLS. Они не ограничены SSL.
Когда я использую что? Когда я не использую какой?
Между явным и неявным SSL / TLS это не имеет большого значения. Важно то, что ваш клиент знает, чего ожидать, и настроен соответствующим образом для этого. Что еще более важно, он должен быть настроен на отклонение текстовых соединений, когда он ожидает соединения SSL / TLS, будь то явное или неявное .
Основное различие между явным и неявным SSL / TLS будет заключаться в ясности настроек конфигурации.
Например, для LDAP, если клиент является сервером Apache Httpd ( mod_ldap
к сожалению, его документация неправильно маркирует разницу между SSL и TLS), вы можете использовать неявный SSL / TLS с помощью ldaps://
URL (например AuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
) или использовать явный SSL / TLS с использованием дополнительного параметра (например AuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?one TLS
).
Существует, возможно , вообще говоря , немного меньший риск при указании протокола безопасности в схеме URL ( https
, ldaps
, ...) , чем когда ожидает клиента , чтобы настроить дополнительные параметры для включения SSL / TLS, потому что они могут забыть. Это спорно. Также могут быть проблемы в правильности реализации одного и другого (например, я думаю, что клиент Java LDAP не поддерживает проверку имени хоста при использовании ldaps://
, когда это необходимо, тогда как это поддерживается с помощью ldap://
+ StartTLS).
В случае сомнений и совместимости с большим количеством клиентов, если это возможно, кажется, что не будет никакого вреда предлагать обе услуги, когда сервер их поддерживает (ваш сервер будет просто прослушивать два порта одновременно). Многие реализации серверов для протоколов, которые можно использовать в обоих режимах, будут поддерживать оба.
Клиент несет ответственность за то, чтобы не допустить превращения себя в текстовое соединение. Как администратор сервера, вы ничего не можете сделать технически на своей стороне, чтобы предотвратить атаки понижения версии (кроме, возможно, требования клиентского сертификата). Клиент должен проверить, что SSL / TLS включен, независимо от того, подключен он или после STARTTLS
команды -like. Точно так же, как браузер не должен позволять перенаправлять себя с https://
на http://
, клиент для протокола, который поддерживает, STARTTLS
должен убедиться, что ответ был положительным, и соединение SSL / TLS было включено, прежде чем продолжить. В противном случае активный злоумышленник MITM может легко понизить соединение.
Например, в более старых версиях Thunderbird была плохая опция под названием «Использовать TLS, если доступно» , что подразумевало, что если злоумышленник MITM сможет изменить сообщения сервера, чтобы он не объявлял о поддержке STARTTLS, клиент молча позволил бы себе понизиться до простого текстового соединения. (Эта небезопасная опция больше не доступна в Thunderbird.)