Генерация ключа
Первым шагом в подготовке к использованию асимметричного шифрования является создание закрытого ключа. Прежде чем начать, вы должны принять несколько решений:
- Ключевой алгоритм
OpenSSL поддерживает ключи RSA, DSA и ECDSA, но не все типы безоговорочно подходят для любого сценария использования. Например, в качестве ключа веб-сервера повсеместно используется RSA, поскольку ключи DSA по существу ограничены 1024 битами (Internet Explorer не поддерживает ничего более стойкого), а ключи ECDSA ещё не получили широкой поддержки УЦ. Для SSH везде используются DSA и RSA, поскольку ECDSA может не поддерживаться всеми клиентами.
- Размер ключа
Размер ключа по умолчанию может быть небезопасным, поэтому его всегда следует настраивать явно. Например, размер по умолчанию для ключей RSA всего 512 бит, что попросту небезопасно. Если в наши дни вы будете использовать на своём сервере ключ длиной 512 бит, злоумышленник, получив ваш сертификат, может простым перебором (методом “грубой силы”) подобрать ваш закрытый ключ, после чего он или она сможет выдавать себя за ваш веб-сайт. В наши дни безопасными считаются ключи RSA в 2048 бит, их и нужно использовать. Также необходимо использовать ключи DSA длиной 2048 бит и не менее 256 бит для ECDSA.
- Кодовая фраза
Использовать кодовую фразу (passphrase) с ключом необязательно, но настоятельно рекомендуется. Защищённые ключи можно безопасно хранить, транспортировать и создавать резервные копии. С другой стороны, такие ключи неудобны, поскольку без ввода кодовой фразы их использовать нельзя. Например, запрос на ввод кодовой фразы может возникать каждый раз, когда вы захотите перезапустить ваш веб-сервер. В большинстве случаев это либо слишком неудобно, либо создаёт неприемлемые условия для доступности сервисов. Кроме того, использование защищённых ключей в рабочей среде на самом деле не сильно повышает безопасность (если вообще повышает). Это связано с тем, что после первоначальной активации закрытые ключи хранятся в незащищённом виде в памяти программы; злоумышленник, проникнувший на сервер, может получить ключи оттуда, приложив при этом лишь немного больше усилий. Так что кодовые фразы следует рассматривать только в качестве механизма защиты закрытого ключа, пока он не установлен в рабочей среде. Другими словами, нет ничего страшного в том, чтобы в рабочей среде хранить кодовые фразы рядом с ключами. Если же в рабочей среде вам требуется повышенная безопасность, стоит рассмотреть вариант с инвестированием в аппаратные решения7.
Для генерации ключа RSA используйте команду genrsa:
$ openssl genrsa -aes128 -out fd.key 2048 Generating RSA private key, 2048 bit long modulus .... ................................................................................... e is 65537 (0x10001) Enter pass phrase for fd.key: **************** Verifying - Enter pass phrase for fd.key: ****************
Здесь я указал, что ключ будет защищён с помощью AES-128. Также вы можете использовать AES-192 или AES-256 (параметры -aes192 и -aes256, соответственно), но лучше воздержаться от применения других алгоритмов (DES, 3DES и SEED).
Предупреждение: Значение e, которое вы видите в выводе, относится к открытой экспоненте (public exponent), которая по умолчанию установлена в 65537. Это так называемая короткая открытая экспонента, и она значительно повышает производительность верификации RSA.
При использовании параметра -3 можно выбрать в качестве открытой экспоненты число 3 и сделать верификацию ещё быстрее. Однако в истории было несколько неприятных происшествий, связанных с использованием числа 3 в качестве открытой экспоненты, поэтому, как правило, всем рекомендуется придерживаться числа 65537, обеспечивая тем самым запас прочности с исторически доказанной эффективностью.
Закрытые ключи хранятся в так называемом PEM-формате, представляющем собой просто текст:
$ cat fd.key -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,01EC21976A463CE36E9DB59FF6AF689A vERmFJzsLeAEDqWdXX4rNwogJp y95uTnw bOjWRw1 O1qgGqxQXPtH3LWDUz1Ym mkpxmIwlSidVSUuUrrUzIL V21EJ1W9iQ71SJoPOyzX7dYX5GCAwQm9Tsb40FhV/ [21 lines removed...] 4phGTprEnEwrffRnYrt7khQwrJhNsw6TTtthMhx/UCJdpQdaLW/TuylaJMWL1JRW i321s5me5ej6Pr4fGccNOe7lZK 563d7v5znAx Wo1C F7YgF g8LOQ8emC 6AVV -----END RSA PRIVATE KEY-----
Закрытый ключ — это не просто набор случайных данных, как может показаться на первый взгляд. Структуру ключа можно увидеть, используя следующую команду rsa:
$ openssl rsa -text -in fd.key
Enter pass phrase for fd.key: ****************
Private-Key: (2048 bit)
modulus:
00:9e:57:1c:c1:0f:45:47:22:58:1c:cf:2c:14:db:
[...]
publicExponent: 65537 (0x10001)
privateExponent:
1a:12:ee:41:3c:6a:84:14:3b:be:42:bf:57:8f:dc:
[...]
prime1:
00:c9:7e:82:e4:74:69:20:ab:80:15:99:7d:5e:49:
[...]
prime2:
00:c9:2c:30:95:3e:cc:a4:07:88:33:32:a5:b1:d7:
[...]
exponent1:
68:f4:5e:07:d3:df:42:a6:32:84:8d:bb:f0:d6:36:
[...]
exponent2:
5e:b8:00:b3:f4:9a:93:cc:bc:13:27:10:9e:f8:7e:
[...]
coefficient:
34:28:cf:72:e5:3f:52:b2:dd:44:56:84:ac:19:00:
[...]
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
Если вам понадобится иметь отдельно только открытую часть ключа, выделить её можно следующей командой rsa:
$ openssl rsa -in fd.key -pubout -out fd-public.key Enter pass phrase for fd.key: ****************
Заглянув во вновь созданный файл, можно увидеть метки, ясно указывающие на то, что содержимое действительно является открытой информацией:
$ cat fd-public.key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnlccwQ9FRyJYHM8sFNsY PUHJHJzhJdwcS7kBptutf/L6OvoEAzCVHi/m0qAA4QM5BziZgnvv FNnE3sgE5pz iovEHJ3C959mNQmpvnedXwfcOIlbrNqdISJiP0js6mDCzYjSO1NCQoy3UpYwvwj7 0ryR1F abARehlts/Xs/PtX3VamrljiJN6JNgFICy3ZvEhLZEKxR7oob7TnyZDrj IHxBbqPNzeiqLCFLFPGgJPa0cH8DdovBTesvu7wr/ecsf8CYyUCdEwGkZh9DKtdU HFa9H8tWW2mX6uwYeHCnf2HTw0E8vjtOb8oYQxlQxtL7dpFyMgrpPOoOVkZZW/P0 NQIDAQAB -----END PUBLIC KEY-----
Лишний раз убедиться в том, что на выходе вы получили именно то, что хотели — это хорошая практика. Например, если вы забудете указать в командной строке параметр -pubout, выходной файл будет содержать ваш закрытый ключ вместо открытого.
Генерация ключа DSA происходит в два этапа: на первом создаются параметры DSA, а на втором — ключ. Можно выполнять их последовательно один за другим, но мне больше нравится использовать следующие две команды как одну:
$ openssl dsaparam -genkey 2048 | openssl dsa -out dsa.key -aes128 Generating DSA parameters, 2048 bit long prime This could take some time [...] read DSA key writing DSA key Enter PEM pass phrase: **************** Verifying - Enter PEM pass phrase: ****************
Этот подход позволяет мне генерировать защищённый кодовой фразой ключ, не оставляя при этом никаких временных файлов (с параметрами DSA) и/или временных ключей на диске.
Для ключей ECDSA процесс аналогичен, за исключением того, что отсутствует возможность создать ключи произвольных размеров. Вместо этого для каждого ключа вы выбираете именованную кривую (named curve), которая контролирует размер ключа, а также другие параметры EC. В следующем примере создаётся 256-битный ключ ECDSA с использованием именованной кривой secp256r1:
$ openssl ecparam -genkey -name secp256r1 | openssl ec -out ec.key -aes128 using curve name prime256v1 instead of secp256r1 read EC key writing EC key Enter PEM pass phrase: **************** Verifying - Enter PEM pass phrase: ****************
OpenSSL поддерживает много именованных кривых (полный список можно получить с помощью параметра -list_curves), но для ключей веб-сервера выбор ограничен лишь двумя кривыми, которые поддерживаются всеми основными браузерами: secp256r1 (в OpenSSL используется имя prime256v1) и secp384r1.
Примечание: Если вы используете OpenSSL 1.0.2, вы можете сэкономить время, всегда генерируя ключи с помощью команды genpkey, которая была усовершенствована для поддержки различных типов ключей и параметров конфигурации. В настоящее время она представляет собой унифицированный интерфейс для генерации ключей.
Ключевые слова
Ключевые слова набора шифров являются базовыми строительными блоками конфигурации наборов шифров. Каждое имя набора (например, RC4-SHA) является ключевым словом, с помощью которого выбирается ровно один набор. Все остальные ключевые слова отбирают группу наборов в соответствии с некоторыми критериями.
Имена ключевых слов чувствительны к регистру символов. Конечно, можно было бы просто перенаправить вас на документацию OpenSSL для просмотра всего списка ключевых слов, но оказывается, что раздел по шифрам в ней не актуален: в нём не хватает нескольких последних добавлений. По этой причине я попытался задокументировать все ключевые слова в этом разделе.
Групповые ключевые слова — это сокращения для выбора часто используемых наборов шифров. Например, при наличии ключевого слова HIGH будут отобраны только очень стойкие наборы шифров.
Таблица 1.1. Групповые ключевые слова
| Ключевое слово | Значение |
|---|---|
DEFAULT | Список шифров по умолчанию. Определяется во время компиляции, для OpenSSL 1.0.0, как правило, ALL:!aNULL:!eNULL. При настройке отбора наборов шифров в приложении это ключевое слово должно быть указано первым в конфигурационной строке. |
COMPLEMENTOFDEFAULT | Шифры, входящие в ALL, но не задействованные по умолчанию. В настоящий момент это ADH. Обратите внимание, что это правило не распространяется на шифры eNULL, которые не входят в ALL (если это необходимо, используйте COMPLEMENTOFALL). |
ALL | Все наборы шифров, кроме шифров eNULL, которые должны быть включены явно. |
COMPLEMENTOFALL | Наборы шифров, не включённые в ALL, в настоящий момент это eNULL. |
HIGH | Наборы шифров “высокой” криптографической стойкости. В настоящий момент это означает наборы шифров с ключами, имеющими уровень криптостойкости более 128 бит, а также некоторые наборы шифров с уровнем криптостойкости в 128 бит. |
MEDIUM | Наборы шифров “средней” криптографической стойкости, в настоящий момент некоторые из них используют шифрование с уровнем криптостойкости 128 бит. |
LOW | Наборы шифров “низкой” криптографической стойкости. В настоящее время это те из них, в которых используются криптографические алгоритмы с уровнем криптостойкости 64 или 56 бит, за исключением экспортных наборов шифров. Небезопасные. |
EXP, EXPORT | Экспортные криптографические алгоритмы. Включая алгоритмы с уровнем криптостойкости 40 и 56 бит. Небезопасные. |
EXPORT40 | Экспортные алгоритмы с уровнем криптостойкости 40 бит. Небезопасные. |
EXPORT56 | Экспортные алгоритмы с уровнем криптостойкости 56 бит. Небезопасные. |
TLSv1, SSLv3, SSLv2 | Наборы шифров TLS 1.0, SSL 3 и SSL 2, соответственно. |
С помощью ключевых слов алгоритмов хэширования выбираются наборы, использующие конкретный алгоритм хэширования. Например, MD5 отбирает все наборы, которые для проверки целостности полагаются на MD5.
Таблица 1.2. Ключевые слова алгоритмов хэширования
| Ключевое слово | Значение |
|---|---|
MD5 | Наборы шифров, использующие MD5. Устаревшие и небезопасные. |
SHA, SHA1 | Наборы шифров, использующие SHA1. |
SHA256 (v1.0.0 ) | Наборы шифров, использующие SHA256. |
SHA384 (v1.0.0 ) | Наборы шифров, использующие SHA384. |
Примечание: С помощью ключевых слов алгоритмов хэширования выбираются только те наборы шифров, которые проверяют целостность данных на уровне протокола. В TLS 1.2 появилась поддержка аутентифицированного шифрования, представляющего собой механизм, который связывает шифрование с проверкой целостности.
При использовании так называемых наборов AEAD (Authenticated Encryption with Associated Data), протоколу не требуется обеспечивать дополнительную проверку целостности. По этой причине вы не сможете использовать ключевые слова алгоритмов хэширования для выбора наборов AEAD (в настоящее время это наборы, в названии которых присутствует GCM).
В названиях таких наборов используются суффиксы SHA256 и SHA384, но в данном случае они указывают на хэш-функции, используемые для построения используемой с набором псевдослучайной функции (что вносит некоторую путаницу).
С помощью ключевых слов аутентификации наборы выбираются на основании тех методов аутентификации, которые они используют. Сегодня для аутентификации практически во всех публичных сертификатах используется RSA. Со временем мы, вероятно, увидим очень медленный прирост использования сертификатов Elliptic Curve (ECDSA).
Табица 1.3. Ключевые слова аутентификации
| Ключевое слово | Значение |
|---|---|
aDH | Наборы шифров, фактически использующие аутентификацию DH, то есть сертификаты содержат ключи DH. (v1.0.2 ) |
aDSS, DSS | Наборы шифров, использующие аутентификацию DSS, то есть сертификаты содержат ключи DSS. |
aECDH (v1.0.0 ) | Наборы шифров, использующие аутентификацию ECDH. |
aECDSA (v1.0.0 ) | Наборы шифров, использующие аутентификацию ECDSA. |
aNULL | Наборы шифров, не предлагающие аутентификацию. В настоящее время это анонимные алгоритмы DH. Небезопасные. |
aRSA | Наборы шифров, использующие аутентификацию RSA, то есть сертификаты содержат ключи RSA. |
PSK | Наборы шифров, использующие аутентификацию PSK (Pre-Shared Key). |
SRP | Наборы шифров, использующие аутентификацию SRP (Secure Remote Password). |
С помощью ключевых слов обмена ключами наборы выбираются на основании алгоритма обмена ключами. Когда речь заходит о наборах с эфемерным обменом по протоколу Диффи-Хеллмана, разработчики OpenSSL непоследовательны в именовании наборов и ключевых слов.
В названиях наборов эфемерные алгоритмы обмена ключами, как правило обозначаются буквой E на конце названия алгоритма (например, ECDHE-RSA-RC4-SHA и DHE-RSA-AES256-SHA), а в ключевых словах отбора буква E указывается в начале (например, EECDH и EDH).
Таблица 1.4. Ключевые слова обмена ключами
| Ключевое слово | Значение |
|---|---|
ADH | Наборы шифров с анонимным обменом DH. Небезопасные. |
AECDH (v1.0.0 ) | Наборы шифров с анонимным обменом ECDH. Небезопасные. |
DH | Наборы шифров, использующие обмен DH (в том числе эфемерный и анонимный обмен DH). |
ECDH (v1.0.0 ) | Наборы шифров, использующие обмен ECDH (в том числе эфемерный и анонимный обмен ECDH). |
EDH (v1.0.0 ) | Наборы шифров, использующие эфемерное согласование ключей DH. |
EECDH (v1.0.0 ) | Наборы шифров, использующие эфемерный обмен ECDH. |
kECDH (v1.0.0 ) | Наборы шифров, использующие эфемерное согласование ключей ECDH. |
kEDH | Наборы шифров, использующие эфемерное согласование ключей DH (включая анонимный обмен DH). |
kEECDH (v1.0.0 ) | Наборы шифров, использующие эфемерное согласование ключей ECDH (включая анонимный обмен ECDH). |
kRSA, RSA | Наборы шифров, использующие алгоритм обмена ключами RSA. |
С помощью ключевых слов шифров наборы выбираются на основании используемых ими шифров.
Таблица 1.5. Ключевые слова шифров
| Ключевое слово | Значение |
|---|---|
3DES | Наборы шифров, использующие Triple DES. Устаревшие и небезопасные. |
AES | Наборы шифров, использующие AES. |
AESGCM (v1.0.0 ) | Наборы шифров, использующие AES GCM. |
CAMELLIA | Наборы шифров, использующие Camellia. Устаревшие. |
DES | Наборы шифров, использующие Single DES. Устаревшие и небезопасные. |
eNULL, NULL | Наборы шифров не использующие шифрование. Небезопасные. |
IDEA | Наборы шифров, использующие IDEA. Устаревшие. |
RC2 | Наборы шифров, использующие RC2. Устаревшие и небезопасные. |
RC4 | Наборы шифров, использующие RC4. Небезопасные. |
SEED | Наборы шифров, использующие SEED. Устаревшие. |
Остаётся ряд наборов, которые не вписываются ни в одну из рассмотренных ранее категорий. Основная их часть связана со стандартами ГОСТ, которые актуальны для стран, входящих в Содружество Независимых Государств, образовавшееся после распада Советского Союза.
Таблица 1.6. Прочие ключевые слова
| Ключевое слово | Значение |
|---|---|
@STRENGTH | Сортирует текущий список наборов шифров в порядке длины ключа алгоритма шифрования.. |
aGOST | Наборы шифров, использующие аутентификацию GOST R 34.10 (как 2001, так и 94). Для работы требуется модуль обеспечения совместимости с ГОСТ. |
aGOST01 | Наборы шифров, использующие аутентификацию GOST R 34.10-2001. |
aGOST94 | Наборы шифров, использующие аутентификацию GOST R 34.10-94. Устаревшие. Вместо них используйте GOST R 34.10-2001. |
kGOST | Наборы шифров, использующие обмен ключами VKO 34.10, определённый в RFC 4357. |
GOST94 | Наборы шифров, использующие HMAC, основанный на GOST R 34.11-94. |
GOST89MAC | Наборы шифров, использующие GOST 28147-89 MAC вместо HMAC. |
Собираем всё вместе
Для демонстрации того, как объединяются различные функции конфигурации наборов шифров, рассмотрим один законченный пример реального использования. Но не забывайте о том, что это всего лишь пример. Поскольку при выборе реальной конфигурации обычно необходимо учитывать множество аспектов, не существует такого понятия, как единственно возможная идеальная конфигурация.
По этой причине, прежде чем вы приступите к работе над своей конфигурацией, у вас должно быть чёткое представление о том, чего вы хотите достичь. В рассматриваемом случае я хотел получить достаточно безопасную и эффективную конфигурацию, которую можно определить следующим образом:
Используются только стойкие шифры с фактическим уровнем криптостойкости 128 бит и выше (это исключает 3DES).
Используются только наборы, обеспечивающие строгую аутентификацию (это исключает анонимные и экспортные наборы).
Не используются любые наборы, полагающиеся на уязвимые исходные алгоритмы (например, MD5).
Реализуется надежная поддержка прямой секретности, независимо от того, какие ключи и протоколы применяются. С этим требованием связано небольшое снижение производительности, потому что не будет возможности использовать быстрый обмен ключами RSA. Чтобы минимизировать это снижение, мы будем отдавать приоритет ECDHE, которые значительно быстрее, чем DHE.
Предпочтение отдаётся ECDSA над RSA. Это требование имеет смысл только при использовании в системе двух вариантов шифрования. То есть мы хотим использовать более быстрые операции ECDSA там, где это только возможно, но откатываться на RSA при взаимодействии с клиентами, которые ещё не поддерживают ECDSA.
При работе с клиентами TLS 1.2 предпочтение отдаётся наборам AES GCM, обеспечивающим наилучший уровень безопасности, который только может предложить TLS.
Поскольку недавно выяснилось, что шифры RC4 слабее, чем это считалось ранее11, поместим их в конец нашего списка. Это почти также эффективно, как и полное их отключение. Хотя BEAST всё ещё может быть проблемой в некоторых ситуациях, предполагается, что о минимизации этой атаки позаботились на стороне клиента.
Обычно лучший подход — начать с полного удаления всех компонентов и наборов, которые вы не хотите использовать; это уменьшает беспорядок и гарантирует, что нежелательные наборы не будут случайно добавлены в конфигурацию по ошибке.
Слабые наборы могут быть идентифицированы следующими ключевыми словами:
aNULL; без аутентификацииeNULL; без шифрованияLOW; наборы с низкой стойкостью3DES; фактическая стойкость — 108 битMD5; наборы, использующие MD5EXP; устаревшие экспортные наборы
Для уменьшения количества выводимых наборов я собираюсь полностью устранить все наборы DSA, PSK, SRP и ECDH, поскольку они используются крайне редко. Также я удалю шифры IDEA и SEED, которые устарели, но все еще могут поддерживаться OpenSSL. В своей конфигурации я также не буду использовать CAMELLIA, потому что он медленнее и не так хорошо поддерживается, как AES (например, на практике нет вариантов GCM или ECDHE).
!aNULL !eNULL !LOW !3DES !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !IDEA !SEED
Теперь мы можем сосредоточиться на том, чего хотим достичь. Поскольку нашим приоритетом является прямая секретность, мы можем начать с ключевых слов kEECDH и kEDH:
kEECDH kEDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !IDEA ↩ !SEED
Если протестировать эту конфигурацию, обнаружится, что наборы RSA перечислены первыми, хотя мы хотели бы видеть первыми ECDSA:
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384 ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD [...]
Чтобы это исправить, поместим kEECDH ECDSA в начало конфигурации:
kEECDH ECDSA kEECDH kEDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !DSS !PSK !SRP !kECDH ↩ !CAMELLIA !IDEA !SEED
Следующая проблема — то, что более старые наборы (SSL 3) перемешаны с более новыми (TLS 1.2). Для обеспечения максимальной безопасности хотелось бы, чтобы клиенты, поддерживающие TLS 1.2, всегда согласовывали именно TLS 1.2. Чтобы переместить более старые наборы в конец списка, я использую ключевое слово SHA (наборы TLS 1.2 всегда используют либо SHA256, либо SHA384, то есть под это условие они не попадут):
kEECDH ECDSA kEECDH kEDH SHA !aNULL !eNULL !LOW !3DES !MD5 !EXP !DSS !PSK !SRP !kECDH ↩ !CAMELLIA !IDEA !SEED
В таком виде конфигурация практически полностью отвечает нашим требованиям. Осталось поместить оставшиеся ещё неохваченными безопасные наборы в конец списка; сделаем это с помощью ключевого слова HIGH. Кроме того, нужно удостовериться, что наборы RC4 являются последними; с помощью ключевого слова RC4 мы переместим уже существующие наборы RC4 в конец списка, а с помощью ключевого слова RC4 добавим туда же ещё незадействованные наборы RC4:
kEECDH ECDSA kEECDH kEDH HIGH SHA RC4 RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !DSS ↩ !PSK !SRP !kECDH !CAMELLIA !IDEA !SEED
Давайте рассмотрим окончательный результат, который состоит из 28 наборов. В первой группе у нас наборы TLS 1.2:
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384 ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256 ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256 DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256 DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256 AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256 AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
Сначала идут наборы ECDHE, затем — DHE, а за ними уже все остальные наборы TLS 1.2. В каждой из подгрупп приоритет имеют ECDSA и GCM.
Во второй группе представлены наборы, которые будут использоваться клиентами TLS 1.0. Приоритеты здесь такие же, как и в первой группе:
ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1 ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1 DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 DHE-RSA-SEED-SHA SSLv3 Kx=DH Au=RSA Enc=SEED(128 ) Mac=SHA1 AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
И наконец, наборы RC4 представлены в конце списка:
ECDHE-ECDSA-RC4-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=RC4(128) Mac=SHA1 ECDHE-RSA-RC4-SHA SSLv3 Kx=ECDH Au=RSA Enc=RC4(128) Mac=SHA1 RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1
Создание сертификатов с помощью программы openssl
1. Выберем каталог для хранения ключей и сертификатов и назначим необходимый уровень доступа.
# mkdir /root/ca
# cd /root/ca
# mkdir certs crl newcerts private
# chmod 700 private
# touch index.txt
2. Сгенерируем приватный ключ.
# openssl genrsa -out /root/ca/private/ca_key.pem 2048
3. Создадим сертификат CA для этого приватного ключа
# openssl req -new -x509 -days 3650 -key /root/ca/private/ca_key.pem -out /root/ca/certs/ca.crt
Выводкоманды
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:NSO
Locality Name (eg, city) []:Novosibirsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Kraftec
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.kraftec.net
Email Address []:dit@kraftec.net
Для создания сертификата SSL для Captive портала и Веб-консоли необходимо создать файл конфигурации
Создадим конфигурационный файл для OpenSSL.
# touch /root/ca/openssl.cnf
Добавим в данный файл следующие блоки
##########################################################################
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /root/ca
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $certs/ca.crt
private_key = $dir/private/ca_key.pem
serial = $dir/serial
crlnumber = $dir/crlnumber
crl = $dir/crl/crl.pem
RANDFILE = $dir/private/.rand
x509_extensions = usr_cert
name_opt = ca_default
cert_opt = ca_default
crl_extensions = crl_ext
default_days = 365
default_crl_days= 30
default_md = sha256
preserve = no
policy = policy_match
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
string_mask = utf8only
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = RU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NSO
localityName = Locality Name (eg, city)
localityName_default = Novosibirsk
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Kraftec
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[ usr_cert ]
basicConstraints=CA:FALSE
nsCertType = server
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
subjectAltName=DNS:auth.kraftec.net, DNS:logout.kraftec.net, DNS:block.kraftec.net, DNS:ftpclient.kraftec.net, DNS:sslvpn.kraftec.net
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ crl_ext ]
authorityKeyIdentifier=keyid:always
##########################################################################
Сгенерируем ключ для SSL сертификата Captive портала
# openssl genrsa -out /root/ca/private/Captiv_key.pem 2048
Сгенерируем ключ для SSL сертификата Веб-консоли
# openssl genrsa -out /root/ca/private/Web_key.pem 2048
Сгенерируем запрос на SSL сертификат Captive портала
# openssl req -new -key /root/ca/private/Captiv_key.pem -config /root/ca/openssl.cnf -out /root/ca/Captive.csr
Выводкоманды
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [RU]:
State or Province Name (full name) [NSO]:
Locality Name (eg, city) [Novosibirsk]:
Organization Name (eg, company) [Kraftec]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:auth.kraftec.net
Email Address []:dit@kraftec.net
Подпишем полученный запрос с помощью сертификата УЦ.
# openssl x509 -req -days 365 -CA /root/ca/certs/ca.crt -CAkey /root/ca/private/ca_key.pem -extfile /root/ca/openssl.cnf -extensions usr_cert -in Captive.csr -out Captive.crt
Вывод команды
Signature ok
subject=/C=RU/ST=NSO/L=Novosibirsk/O=Kraftec/CN=auth.kraftec.net/emailAddress=dit@kraftec.net
Getting CA Private Key
Сгенерируем запрос на SSL сертификат Веб-консоли
Предварительно исправим конфигурационный файл в расширении usr_cert изменим параметр на subjectAltName=DNS:utm.kraftec.net
# openssl req -new -key /root/ca/private/Web_key.pem -config /root/ca/openssl.cnf -out /root/ca/Web.csr
Выводкоманды
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [RU]:
State or Province Name (full name) [NSO]:
Locality Name (eg, city) [Novosibirsk]:
Organization Name (eg, company) [Kraftec]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:utm.kraftec.net
Email Address []:dit@kraftec.net
Подпишем полученные запросы с помощью сертификата УЦ.
# openssl x509 -req -days 365 -CA /root/ca/certs/ca.crt -CAkey /root/ca/private/ca_key.pem -extfile /root/ca/openssl.cnf -extensions usr_cert -in Web.csr -out Web.crt
Вывод команды
Signature ok
subject=/C=RU/ST=NSO/L=Novosibirsk/O=Kraftec/CN=utm.kraftec.net/emailAddress=dit@kraftec.net
Getting CA Private Key
Импортируем данные сертификаты и приватные ключи в UserGate в раздел сертификаты.
Сертификату ca.crt назначим роль SSL дешифрование
Сертификату Captive.crt назначим роль SSL captive-портала
Сертификату Web.crt назначим роль SSL веб-консоли
На компьютеры пользователей установим сертификат ca.crt в хранилище Доверенные корневые центры сертификации.
Установка ssl сертификата в microsoft iis 10
В данной статье описан Импорт SSL сертификата в IIS 10, выпуск SSL сертификата был описан ранее. Для импорта нам потребуется конвертировать сертификат из PEM в PFX. Для этого используем OpenSSL на сервере, если его нет или вы не знаете его команд, можно использовать онлайн Конвертер или его аналоги.
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

Для надежности заполняем PFX Password и запоминаем/записываем пароль (желательно символьно-числовой), без него сертификат не установить.
Импорт SSL сертификата
Поиском открываем консоль Microsoft Management Console (MMC), достаточно ввести mmc и ее нам найдет.
В окне консоли «Файл» > «Добавить/удалить оснастку»

Далее, в окне «Добавление и удаление оснасток» на панели «Доступные оснастки» (слева) выберите «Сертификаты» и нажмите «Добавить>».
Видим окно «Оснастка диспетчера сертификатов» > выберите «учетной записи компьютера» и нажмите «Далее>».

В окне «Выбор компьютера» выберите «Локальным компьютером (тем, на котором выполняется эта консоль)» и нажмите «Готово».

В окне «Добавление и удаление оснасток» нажмите «ОК».
В окне консоли (Корень консоли, слева), щелкните правой кнопкой мыши (ПКМ) на папку «Размещение Веб-служб» и выберите «Все задачи» > «Импорт».

Видим окно Мастер импорта сертификатов и нажимаем кнопку Далее.

На странице импорта найдите через «Обзор» и выберите файл, который вы хотите импортировать, а затем нажмите «Далее».
Заранее файл был добавлен в C:WindowsSystem32 (Вы можете поместить его в иной каталог). Примечание: в окне «Проводника» в раскрывающемся списке «Тип файла» обратите внимание на типов файлов и выберите «Все файлы» (*.*) или (*.pfx), для поиска файла сертификата.

В окне «Защита с помощью закрытого ключа» задаем пароль, который указывали при конвертации сертификата в PFX и проверяем галочки, как на изображении ниже:

нажимаем «Далее»
На странице «Хранилища сертификатов» выбираем «Поместить все сертификаты в следующее хранилище», где в окне «Выбор хранилища сертификатов» выберите «Размещение Веб-служб» и нажмите «ОК». Нажмите кнопку «Далее»

На странице «Завершение мастера импорта сертификатов» проверяем правильность настроек и нажимаем кнопку Готово.

Вы должны получить сообщение «Импорт выполнен успешно».
Сертификат SSL с закрытым ключом в файле .pfx теперь сохранен в хранилище хостинга.
Как настроить Windows Server для использования импортированного сертификата SSL
После импорта сертификата SSL в Windows Server необходимо настроить IIS 10, чтобы импортированный сертификат давал защиту вашему сайту.
Откройте «Диспетчер служб IIS» > в дереве меню Подключения (левая панель) разверните панель и выберите сайт (у нас это Default Web Site). Видим «Начальная страница Default Web Site» (по центру), где в меню «Действия» (правая панель) в разделе «Изменение веб-сайта» щелкните на ссылку «Привязки…». В окне «Привязки сайта» нажмите «Добавить»

В окне «Добавление привязки сайта» выполните следующие действия и нажмите кнопку «ОК»:
Тип: из списка выберите https
IP-адрес: выберите «Все неназначенные»
Порт: 443 (Порт, через который трафик будет зашифрован с помощью SSL по умолчанию 443)
SSL-Сертификат: В раскрывающемся списке выберите сертификат SSL (надо указать точное имя установленного сертификата, у нас domainssl.ua)

Готово, SSL-сертификат установлен и сайт настроен на безопасное соединение. Можно закрыть окно.

Настройка перенаправления HTTP на HTTPS в IIS
После того как мы установили сертификат SSL, сайт по-прежнему остается доступным через обычное соединение HTTP, которое считается небезопасным. Для безопасного подключения посетители должны самостоятельно указать https:// при вводе адреса вашего сайта (домена) в своих браузерах и зачастую этого никто не делает.
Чтобы установить безопасное соединение на вашем сайте, необходимо настроить правило перенаправления (редирект) HTTP на HTTPS. После чего, любой посетитель вашего сайта переходя/вводя домен «yourdomain.com», будет перенаправлен на «https://yourdomain.com» или «https://www.yourdomain.com» (в зависимости от вашего выбора), где весь трафик зашифрован при передаче между сервером и клиентом.
Откройте «Диспетчер служб IIS» > в дереве меню Подключения (левая панель) разверните панель и выберите сайт (у нас это Default Web Site). Видим «Начальная страница Default Web Site», где дважды щелкнуть (ЛКМ) на значок «Переопределение URL-адресов».

Если URL Rewrite Module отсутствует, качаем его на сайте IIS
В окне «Добавить правила» меню «Правила для входящего трафика» выберите «Пустое правило», затем нажмите ОК.

Указываем Имя правилу и заполняем ниже расположенные разделы:
В разделе «Соответствует URL-адресу»:
– Указать «Соответствует шаблону» из меню «Запрошенный URL-адрес».
– Указать «Регулярные выражения» из меню «Использование».
– Шаблон: (. *)
– Установить флажок «Не учитывать регистр»
В разделе «Условия» выберите «Совпадение со всеми» из меню «Логическая группировка» и нажмите «Добавить».
В появившемся окне «Добавить условие»:
– Введите {HTTPS} в поле «Ввод условия»
– Выберите «Соответствует шаблону» из выпадающего списка
– Введите ^ OFF $ в поле «Шаблон»
– Флажок «Не учитывать регистр»
– Нажмите ОК

В разделе «Действие» выберите «Перенаправление» из меню «Типа действия» и укажите в поле «URL-адрес перенаправления»:
https://{HTTP_HOST}/{R:1}Установите флажок «Добавить строку запроса»
Выберите «Постоянное (301)» из меню «Тип перенаправления»

Нажмите «Применить» вверху справа из меню «Действия».
Теперь нам нужно применить правило к самому сайту.

В «Диспетчер служб IIS» щелкните ПКМ на свой сайт (у нас это Default Web Site) и выберите «Проводник», откроется корневой каталог сайта, где найдите файл web.config и откройте его. Проверьте содержимое на следующий блок кода (если его нет, добавьте). Также, не лишним будет сделать бекап файла web.config в случае неудачи, можно вернуть старый файл. Главное вписать код в соответствующие блоки в файле.
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name=”HTTPS force” enabled=”true” stopProcessing=”true”>
<match url=”(.*)” />
<conditions>
<add input=”{HTTPS}” pattern=”^OFF$” />
</conditions>
<action type=”Redirect” url=”https://{HTTP_HOST}/{R:1}” redirectType=”Permanent” />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>Если web.config отсутствует, создайте новый файл ТХТ (например, 1.txt) и вставьте в него код, сохраните, а потом переименуйте файл в web.config
Теперь перенаправление можно проверить, перейдя на сайт по адресу http:// но откроет https:// и браузер покажет Безопасное соединение и замочек.
Можно использовать анонимный режим браузера (Ctrl Shift N для Chrome) и отладчик (F12).
