Skip to content

Instantly share code, notes, and snippets.

@furdarius
Last active March 13, 2022 19:26
Show Gist options
  • Save furdarius/f976c4720c44bd7d04a8fea333f3016e to your computer and use it in GitHub Desktop.
Save furdarius/f976c4720c44bd7d04a8fea333f3016e to your computer and use it in GitHub Desktop.
О том как генерировать SSL сертификаты

Криптографические алгоритмы

На сегодняшний день (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

Преимущества ECC над RSA:

  • Меньший размер ключа.
  • Намного быстрее генерация ключа.
  • Быстрее подпись данных.
  • Умеренно быстрое шифрование и дешифрование.

Недостатки ECC в сравнении с RSA

  • Теория и реализация существенно сложнее.
  • При использовании кривого генератора случайных чисел ключ может быть скомпрометирован.
  • Теоретически новые алгоритмы могут быть менее проверенными, например это касается binary curves.
  • До сих пор имеются некоторые проблемы с патентами, особенно это касается binary curves.

Таким образом, если вы задумались о том, что выбрать при генерации SSL сертификата, смело выбирайте ECC

Генерация Self-Sign сертификата

Для работы с ключами принято использовать 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")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment