Чтение онлайн

на главную - закладки

Жанры

19 смертных грехов, угрожающих безопасности программ

Виега Джон

Шрифт:

Искупление греха

Когда использование SSL или TLS оправдано, проверяйте выполнение следующих условий:

□ используется последняя версия протокола (во время работы над книгой это была версия TLS 1.1);

□ используются стойкие шифры (к нестойким относятся прежде всего RC4 и DES);

□ проверяется, что текущая дата попадает в период действия сертификата;

□ гарантируется, что сертификат прямо или косвенно выпущен доверенным источником (корневым УЦ);

□ проверяется, что хранящееся в сертификате имя хоста соответствует

ожидаемому.

Кроме того, необходимо реализовать хотя бы один метод работы с отозванными сертификатами: либо сверку с CRL–списком, либо запрос по протоколу OCSP.

Выбор версии протокола

В большинстве языков высокого уровня не существует простого способа указать, каким протоколом вы хотели бы воспользоваться. Вы просто запрашиваете защищенный сокет, а библиотека устанавливает соединение и возвращает результат. Например, в языке Python имеется функция ssl из модуля socket, которая принимает объект сокета и защищает его по протоколу SSL, но не позволяет указать ни версию протокола, ни шифр. Базовым API в таких языках, как Perl или РНР, присуща та же проблема. Для исправления ситуации часто приходится писать код на языке низкого уровня или копаться в скрытом API, обертывающем такой код (написанный, например, с использованием библиотеки OpenSSL).

В языках низкого уровня возможность задать версию протокола встречается чаще. Так, Java хотя и не поддерживает TLS 1.1 (в версии 1.4.2), но, по крайней мере, позволяет сказать, что вас устраивает только протокол TLS версии 1.0:

...

from javax.net.ssl import SSLSocket;

...

SSLSocket s = new SSLSocket("www.example.com", 25);

s.setEnabledProtocols("TLSv1");

Каркас .NET Framework 2.0 также поддерживает лишь TLS vl.O. В приведенном ниже фрагменте показано, как можно запросить использование TLS. При этом также затребуется проверка даты, а задание в качестве последнего аргумента метода AuthenticateAsClient равным true говорит, что нужно еще проверять сертификат по CRL–списку:

...

RemoteCertificateValidationCallback rcvc = new

RemoteCertificateValidationCallback(OnCertificateValidation);

SslStream sslStream = new SslStream(client.GetStream, false, rcvc);

sslStream.AuthenticateAsClient("www.example.com", // Имя сервера

null, // цепочка сертификатов

SslProtocols.Tls, // использовать TLS

true); // проверять по CRL

...

// Обратный вызов для дополнительных проверок сертификата

private static bool OnCertificateValidation(object sender,

X509Certificate certificate,

X509Chain chain,

SslPolicyErrors sslPolicyErrors) {

if (sslPolicyErrors == SslPolicyErrors.None) {

return false;

}

else {

return true;

}

}

В обоих примерах клиент не сможет установить соединение с сервером, поддерживающим только более старые версии протокола.

В написанных на С библиотеках, например OpenSSL или Microsoft Security Support Provider Interface (SSPI –

интерфейс провайдера поддержки безопасности) есть схожие интерфейсы, но, так как это низкоуровневые средства, то кода придется писать больше.

Выбор семейства шифров

Как и в случае выбора протокола, задать семейство шифров в языке высокого уровня сложно. В низкоуровневых языках такая возможность есть, но умолчания, на наш взгляд, оставляют желать лучшего. Например, в API Java Secure Sockets Extensions QSSE – защищенные сокеты в Java) в качестве симметричных шифров можно выбирать RC4, DES, 3DES и AES. Но первыми двумя лучше не пользоваться.

Вот полный перечень шифров, предлагаемых Sun, в порядке приоритета (в таком порядке Java будет пробовать их, если вы ничего не укажете):

□ SSL_RSA_WITH_RC4_12 8_MD5

□ SSL_RSA_WITH_RC4_12 8_SHA

□ TLS_RSA_WITH_AES_12 8_CBC_SHA

□ TLS_DHE_RSA_WITH_AES_12 8_CBC_SHA

□ TLS DHE DSS WITH AES 128 CBC SHA

□ SSL_RSA_WITH_3DES_EDE_CBC_SHA

□ SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA

□ SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA

□ SSL_RSA_WITH_DES_CBC_SHA

□ SSL_DHE_RSA_WITH_DES_CBC_SHA

□ SSL_DHE_DSS_WITH_DES_CBC_SHA

□ SSL_RSA_EXPORT_WITH_RC4_4 0_MD5

□ SSL_RSA_EXPORT_WITH_DES4 0_CBC_SHA

□ SSL_DHE_RSA_EXPORT_WITH_DES4 0_CBC_SHA

□ SSL_DHE_DSS_EXPORT_WITH_DES4 0_CBC_SHA

Первые два семейства шифров нежелательны из соображений долгосрочной безопасности, но именно они, скорее всего, и будут использованы! Мы рекомендуем выбирать любое из последующих трех семейств, поскольку AES считается самым лучшим из современных криптографических алгоритмов. (Вопроса о выборе алгоритма открытого ключа и кода аутентификации сообщений (MAC) мы здесь не касаемся.) Чтобы принять только три указанных алгоритма, надо написать такой код:

...

private void useSaneCiperSuites(SSLSocket s) {

s.setEnabledCipherSuites({"TLS_RSA_WITH_AES_128_CBC_SHA",

"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",

"TLS_DHE_DSS_WITH_AES_128_CBC_SHA"});

}

Проверка сертификата

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

Обычно (хотя и не всегда) для выполнения проверки нужно получить ссылку на сертификат сервера (часто его называют сертификатом «партнера» (peer certificate)). Например, в Java до инициализации SSL–соединения можно зарегистрировать объект–слушатель HandShakeCompletedListener для объекта SSLSocket. Слушатель должен реализовать такой метод:

...

public void handshakeCompleted(HandShakeCompletedEvent event);

Получив объект, описывающий событие, вы можете далее написать:

Поделиться:
Популярные книги

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Бестужев. Служба Государевой Безопасности. Книга четвертая

Измайлов Сергей
4. Граф Бестужев
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга четвертая

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4