Создаем ECDSA сертификаты Let’s Encrypt

Дата: 21.07.2016

Как показывает практика, использование ECDSA сертификатов позволяет добиться примерно в два раз большего количества соединений на одной аппаратной платформе. К недостаткам использования ECDSA сертификатов следует отнести проблему с поддержкой браузерами. Но данная проблема легко решается если мы будем использовать ECDSA и RSA сертификаты одновременно.

Перед тем как начать проверьте, что в системе установлен git, в противном случае необходимо запустить установку командой:

apt-get install git

Выберите каталог, в который будут загружены файлы клиента Let’s Encrypt. В этой статье я буду использовать каталог /usr/local. Переходим в указанный каталог, а затем загружаем и запускаем клиент Let’s Encrypt:

cd /usr/local
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Последняя команда установит все необходимые пакеты и выведет справочную информацию для работы с клиентом. Далее вам нужно создать каталог для файлов ключа и сертификата домена:

mkdir -p /usr/local/letsencrypt/live-ecdsa/codebeer.ru/letmp

Перед тем как создать файл ключа, важно правильно выбрать тип кривой. Большинство современных браузеров поддерживает кривые secp256r1, secp384r1, secp521r1. Я буду использовать 256-битная кривую prime256v1, которая по современным меркам обеспечивает достаточной секретности. Список кривых OpenSSL можно вывести командой:

openssl ecparam -list_curves

Создаем приватный ключ:

cd /usr/local/letsencrypt/live-ecdsa/codebeer.ru
openssl ecparam -genkey -name secp256r1 > key-256r1.pem

Теперь создаем свой CSR:

openssl req -new -sha256 -key key-256r1.pem -subj "/CN=codebeer.ru" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:codebeer.ru,DNS:www.codebeer.ru")) -outform der -out csr-256r1.der

Переходим в каталог letmp и создаем ECDSA Let’s Encrypt сертификат:

cd letmp
/usr/local/letsencrypt/letsencrypt-auto certonly -a webroot --email webmaster@codebeer.ru --webroot-path /www/codebeer.ru/ --csr /usr/local/letsencrypt/live-ecdsa/codebeer.ru/csr-256r1.der --renew-by-default --agree-tos

Если вы используете веб-сервер Nginx, то во время создания сертификата клиент Let’s Encrypt вы можете получить такую ошибку:

 Failed authorization procedure. www.codebeer.ru (http-01): urn:acme:error:unauth orized :: The client lacks sufficient authorization :: Invalid response from htt p://www.codebeer.ru/.well-known/acme-challenge/oVRUfF1DISR8zRpq1Vju4C7XrYm2YULSe 5TVRfmGy64: "<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>", codebeer.ru (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://codebeer.ru/.well -known/acme-challenge/yKovcd-Eemc6ezWUWNKiL3MKgs6htk06lfuQmYeBwdA: "<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>"

IMPORTANT NOTES:
 - The following errors were reported by the server:

 Domain: www.codebeer.ru
 Type: unauthorized
 Detail: Invalid response from
 http://www.codebeer.ru/.well-known/acme-challenge/oVRUfF1DISR8zRpq1Vju4C7XrYm 2YULSe5TVRfmGy64:
 "<html>
 <head><title>403 Forbidden</title></head>
 <body bgcolor="white">
 <center><h1>403 Forbidden</h1></center>
 <hr><center>"

 Domain: codebeer.ru
 Type: unauthorized
 Detail: Invalid response from
 http://codebeer.ru/.well-known/acme-challenge/yKovcd-Eemc6ezWUWNKiL3MKgs6htk0 6lfuQmYeBwdA:
 "<html>
 <head><title>403 Forbidden</title></head>
 <body bgcolor="white">
 <center><h1>403 Forbidden</h1></center>
 <hr><center>"

 To fix these errors, please make sure that your domain name was
 entered correctly and the DNS A record(s) for that domain
 contain(s) the right IP address.

В этом случае вам нужно добавить в конфиг виртуального следующие строки:

location ~ /.well-known {
    allow all;
}

Если все прошло успешно, в каталоге letmp появятся следующие файлы:

0000_cert.pem  0000_chain.pem  0001_chain.pem

Копируем их содержимое в один файл:

cat 0001* > /usr/local/letsencrypt/live-ecdsa/codebeer.ru/chain.pem

Теперь необходимо указать путь к сертификату и ключу в конфиге nginx:

ssl_certificate /usr/local/letsencrypt/live-ecdsa/codebeer.ru/chain.pem;
ssl_certificate_key /usr/local/letsencrypt/live-ecdsa/codebeer.ru/key-256r1.pem;