На сегодняшний день (27 января 2017) в криптографии наиболее широко распространены алгоритмы построенные на базе RSA и Elliptic Curves.
RSA имеет большую популярность, в следствии того, что был изобретен раньше и прост в исполнении. RSA основан на вычислительной сложности задачи факторизации больших целых чисел.
Задачей факторизации люди занимаются уже множество десятилетий, а вот субэкспоненциальных алгоритмов решения задачи дискретного логарифмирования на сегодняшний день не известно. Алгортмы основанные на эллиптических кривых используют именно этот факт.
Ответ на StackExchange о том, почему RSA более популярен чем EC: http://crypto.stackexchange.com/a/1194
Основное преимущество ECC (Elliptic Curve Cryptography) в том, что мы можем использовать меньшую длину ключа поддерживая при этом высокий уровень безопасности.
Ниже вольный перевод ответа с Quora о преимуществах и недостатках: https://www.quora.com/Which-one-is-better-elliptic-curve-cryptography-or-RSA-algorithm-and-why
- Меньший размер ключа.
- Намного быстрее генерация ключа.
- Быстрее подпись данных.
- Умеренно быстрое шифрование и дешифрование.
- Теория и реализация существенно сложнее.
- При использовании кривого генератора случайных чисел ключ может быть скомпрометирован.
- Теоретически новые алгоритмы могут быть менее проверенными, например это касается binary curves.
- До сих пор имеются некоторые проблемы с патентами, особенно это касается binary curves.
Таким образом, если вы задумались о том, что выбрать при генерации SSL сертификата, смело выбирайте ECC
Для работы с ключами принято использовать OpenSSL
openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout domain.key -out domain.crt -days 365
Команда openssl req
— это запрос на генерацию нового сертификата.
Параметры:
-x509
— указывает на создание self-signed сертификата.-nodes
— отключаем шифрование получаемого ключа (в ином случае, использование ключа возможно только после ввода пароля)-newkey ec:
— тут мы указываем, что использовать будем алгоритм на базе Elliptic Curve Cryptography, в частности, командойopenssl ecparam -name secp384r1
мы выбираем тип эллептических кривых. secp384r1 будет наиболее оптимальным выбором, так как имеет широкую поддержку и хороший уровень безопасности: http://security.stackexchange.com/a/78624. Рекомендации по длине ключа можно посмотреть тут: https://www.keylength.com/en/4/-keyout
— имя файла, в который записывается ключ-out
— имя файла, в который записывается сертификат-days
— кол-во дней которые сертификат будет валиден
При выполнении команды у вас будут запрошены данные вашего ресурса. Вот так это может выглядеть:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Name
Organizational Unit Name (eg, section) []:Data Science
Common Name (e.g. server FQDN or YOUR name) []:mysite.ru
Email Address []:admin@mysite.ru
Параметр Common Name
обязательно должен совпадать с адресом вашего ресурса.
Возможна неинтерактивная генерация сертификата с использованием параметра -subj
:
openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout mysite.ru.key -out mysite.ru.crt -days 365 -subj "/C=RU/ST=Moscow/L=Moscow/O=My Company Name/CN=mysite.ru"
При использовании сертификата необходимо явно указать Web-серверу какой шифр (chipers) используется.
Для примера выше стоит использовать значение EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
На ресурсе cipherli.st можно узнать какие настройки безопасность актуальны на текущий момент и как установить их в одном из популярных веб-серверов.
UPD: 27.08.2017
Для генерации сертификата, который включает Subject Alter Names необходимо поработать с конфигурационным файлом openssl.cnf
. Узнать его местонахождение можно командой find /usr/lib -name openssl.cnf
.
Далее, на лету изменяем в нём необходимые параметры и генерируем privkey.pem
и fullchain.pem
:
openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout privkey.pem -out fullchain.pem -days 365 -subj "/C=RU/ST=Moscow/L=Moscow/O=My Company/CN=domain.local" -config <(cat /usr/lib/ssl/openssl.cnf | sed 's/\[ v3_ca \]/\[ v3_ca ]\nsubjectAltName = @alternate_names/g' | sed 's/# copy_extensions/copy_extensions/g' | printf "$(cat -)\n[ alternate_names ]\nDNS.1 = domain.local\nDNS.2 = *.domain.local")