В настоящее время я занимаюсь обновлением сертификатов SSL для различных веб-сайтов, которыми я управляю, с сертификатов, совместимых с SHA1, на SHA2.
На сегодняшний день мы всегда использовали «RSA» в качестве механизма обмена ключами в наших сертификатах SSL, и поэтому я решил продолжить делать это при генерации запроса на подпись сертификата для заменяющих сертификатов.
В моей среде разработки я заменил несколько сертификатов и установил приоритеты для наборов шифров на основе SHA256 (SHA-2) на веб-серверах.
Я заметил, что Google Chrome 42 и Firefox 37.0.2 по-прежнему выбирают набор шифров на основе SHA1. TLS_RSA_WITH_AES_256_CBC_SHA
. (Я еще не тестировал Internet Explorer должным образом)
Чтобы определить, какие наборы шифров поддерживают Chrome 42 и Firefox 37.0.2, я выполнил трассировку сети и обнаружил TLSCipherSuites
в пределах ClientHello
.
TLSCipherSuites: Unknown Cipher
TLSCipherSuites: Unknown Cipher
TLSCipherSuites: Unknown Cipher
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2B }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2F }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 { 0x00, 0x9E }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA { 0xC0,0x0A }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA { 0xC0,0x14 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x39 }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA { 0xC0,0x09 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA { 0xC0,0x13 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x33 }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_RC4_128_SHA { 0xC0,0x07 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_RC4_128_SHA { 0xC0,0x11 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_GCM_SHA256 { 0x00, 0x9C }
TLSCipherSuites: TLS_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x35 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x2F }
TLSCipherSuites: TLS_RSA_WITH_RC4_128_SHA { 0x00,0x05 }
TLSCipherSuites: TLS_RSA_WITH_RC4_128_MD5 { 0x00,0x04 }
TLSCipherSuites: TLS_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }
TLSCipherSuites: Unknown Cipher
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2B }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2F }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA { 0xC0,0x0A }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA { 0xC0,0x09 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA { 0xC0,0x13 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA { 0xC0,0x14 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x33 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x39 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x2F }
TLSCipherSuites: TLS_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x35 }
TLSCipherSuites: TLS_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }
Мои веб-серверы работают под управлением Windows Server 2008 R2 и поддерживают следующие наборы шифров (обратите внимание - это порядок предпочтений по умолчанию, с тех пор я установил приоритет для всех наборов на основе SHA256:
TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_MD5,SSL_CK_RC4_128_WITH_MD5,
SSL_CK_DES_192_EDE3_CBC_WITH_MD5,TLS_RSA_WITH_NULL_SHA256,TLS_RSA_WITH_NULL_SHA
Единственный набор шифров SHA256, представленный в Windows Server 2008 R2, который поддерживается Chrome 42 и Firefox 37.0.2, - это TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
(который в Server 2008 R2 имеет _P256
добавлен к имени). Но для поддержки этого пакета мне пришлось бы перевыпустить наши сертификаты, изменив механизм обмена ключами с использованием RSA
к ECDSA
(Алгоритм цифровой подписи с эллиптической кривой). На самом деле я пробовал это, и он отлично работает, но многие старые браузеры не поддерживают криптографию с эллиптическими кривыми. Так что это не жизнеспособное решение.
ОБНОВЛЕНИЕ 28/04/15:
Спасибо тем, кто ответил за дополнительную ясность относительно алгоритма обмена ключами и алгоритма подписи.
Я бы хотел, чтобы браузеры могли с использованием набора шифров SHA256 выполнение аутентификации сообщения с помощью SHA2.
Но проблема остается в том, что из доступных наборов шифров SHA256 в Windows Server 2008 R2 единственный, поддерживающий как Chrome, так и Firefox, - это TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
. И чтобы использовать этот набор шифров, мне нужен сертификат, подписанный ECDSA.
Насколько я понимаю, криптография с эллиптическими кривыми не поддерживает некоторые старые браузеры / операционные системы. Как упоминалось в моем вопросе (хотя я ошибся в терминологии), я действительно создал сертификат, подписанный ECDSA, и хотя я не проводил обширного тестирования, до сих пор я видел, что IE7 и IE8, работающие в Windows XP SP3, не могут загружать мои сайты (через HTTPS) и просто создайте сообщение «Internet Explorer не может отобразить веб-страницу».
Конечно, Windows XP теперь является устаревшей ОС, но я обеспокоен тем, что браузеры / операционные системы, которые «старые», но все еще «поддерживаются», могут таким же образом выйти из строя. Поэтому я заинтересован в поиске решения с использованием сертификата, подписанного RSA, но это кажется невозможным. Я прав насчет этого?
Ссылки SHA256, которые вы видите в списках шифровальных наборов, не предназначены для сертификатов. Скорее они связаны с псевдослучайной функцией TLS и целостностью сообщения.
Поддержка сертификатов не зависит от набора шифров TLS.
Все версии Firefox и Chrome (и последние версии IE) поддерживают сертификаты SHA256, если операционная система также поддерживает их, что для клиентской Windows является XP SP3 и выше. Server 2008 R2 имеет полную поддержку сертификатов SHA256.
Вы не хотите отдавать приоритет алгоритму MAC SHA256 над другими частями набора шифров. Это наименее важная часть. Набор шифров, который у вас должен быть сегодня во главе списка приоритетов на сервере IIS 7.5:
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521
Важнейшие части, которые нужно искать:
Вам следует использовать IIS Crypto (https://www.nartac.com/Products/IISCrypto/) и выберите вариант наилучшей практики. Это даст вам лучший порядок набора шифров, который вы можете достичь в IIS в настоящее время.
Смотрите также мой ответ на этот вопрос:
Изменить механизм обмена ключами в IIS 8
Windows Server 2008 R2 включил шифрование после применения передовых методов шифрования IIS:
Чтобы получить список на стороне сервера, я обычно использую скомпилированную версию кода, доступную здесь в разделе «Список поддерживаемых наборов шифров»;
https://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx
Я загрузил скомпилированную мной версию в Dropbox, если вы хотите ее использовать (на ваш страх и риск, я не несу ответственности. Но это безопасно!)
https://www.dropbox.com/s/mvajmebtyilgics/listciphers.exe?dl=0
Ответ "Ричи Фрейма" точен. Строка набора шифров указывает не на SHA256 внутри подписи. Но в дополнение к ответу Ричи, вот еще один лакомый кусочек:
Но для поддержки этого пакета мне пришлось бы перевыпустить наши сертификаты, изменив механизм обмена ключами с использования «RSA» на «ECDSA» (алгоритм цифровой подписи с эллиптической кривой).
Вы не можете этого сделать. Механизм обмена сеансовыми ключами не закодировано внутри самого сертификата.
Вы смешиваете алгоритм обмена ключами и алгоритм подписи. Путаница в том, что RSA может выполнять как обмен ключами, так и подписи.
Это примерно так:
Для старой типичной установки у вас был бы сертификат, подписанный RSA, и вы также выполняли бы обмен ключами сеанса через RSA.
Для установки более нового типа у вас будет сертификат, подписанный RSA, и вы будете выполнять обмен сеансовыми ключами Диффи-Хеллмана. А затем аутентифицируйте этот анонимный обмен ключами с помощью ключей RSA сертификата.
Для современной установки современного типа у вас будет сертификат, подписанный ECDSA, и вы будете выполнять обмен сеансовыми ключами Elliptic-Curve-Diffie-Hellman (ECDH). А затем аутентифицируйте этот анонимный обмен ключами с помощью ключей ECDSA сертификата.
Обновление 2015-04-29: используйте сертификат sha256rsa
Поэтому я заинтересован в поиске решения с использованием сертификата, подписанного RSA, но это кажется невозможным. Я прав насчет этого?
Нет. К счастью, ты ошибаешься. Вы можете использовать оба в одном сертификате. SHA256 как односторонняя хеш-функция и RSA как алгоритм подписи. (Эта конкретная комбинация имеет кодовое название sha256WithRSAEncryption. Но есть и многие другие.) (Взгляните на https://www.ietf.org/. Прямо сейчас они используют именно эту комбинацию.)
Для совместимости я рекомендую вам почитать в блоге Ивана Ристича.
Иван Ристич, Прекращение поддержки SHA1: что вам нужно знать (Архивировано Вот.)
Одна из ссылок в этом блоге - это таблица совместимости GlobalSign SHA-256. Это может быть для вас особенно интересно.
Обновление 2015-04-29: вам нужно что-то с "RSA_WITH"
Если у вас есть сертификат RSA, значит, вы используете шифрование RSA. Бит шифрования в строке дескриптора набора шифров - это бит непосредственно перед "С УЧАСТИЕМ".
Итак, в вашем случае вам нужно что-то с «RSA_WITH» посередине. Я взял их из списка Firefox, который вы сделали выше:
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2F }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA { 0xC0,0x13 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA { 0xC0,0x14 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x33 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x39 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x2F }
И не беспокойтесь о "SHA" или "SHA256" в конце каждой строки. Это делает не обратитесь к тому, что указано в сертификате. Он относится к тому же алгоритму, но не к его применению внутри сертификата.