Product SiteDocumentation Site

10.2. X.509 certificates

Сертификаты являются важным строительным блоком многих сетевых служб, построенных на криптографических протоколах, когда им требуется своего рода централизованная аутентификация.
Протокол SSL (Secure Socket Layer) был разработан Netscape для защиты соединений веб-серверов. Позднее он был стандартизирован IETF под акронимом TLS (Transport Layer Security). TLS продолжает развиваться и по сей день, в то время как SSL не используется из-за множества недостатков в дизайне.
Протокол TLS в первую очередь направлен на обеспечение конфиденциальности и целостности данных между двумя или более взаимодействующими компьютерными приложениями. Наиболее распространенным случаем в Интернете является связь между клиентом (например, веб-браузером) и сервером.
Для обмена информацией необходима пара ключей, включающая открытый ключ, включающий информацию о личности владельца и соответствующий секретному ключу. Закрытый ключ должен храниться в секрете, иначе безопасность будет нарушена. Однако любой может создать пару ключей, сохранить на ней любую идентификационную информацию и выдать себя за личность по своему выбору. Одно из решений включает в себя концепцию Certification Authority (CA), работающий по стандарту X.509. Этот термин охватывает объект, который содержит доверенную пару ключей, известную как root certificate (корневой сертификат). Этот сертификат используется только для подписи других сертификатов (пар ключей) после того, как были предприняты соответствующие шаги для проверки личности, хранящейся в паре ключей. Приложения, использующие X.509, могут затем проверять предоставленные им сертификаты, если они знают о доверенных корневых сертификатах.
Вы можете реализовать CA (центр сертификации) (как описано в Раздел 10.2.2, «Инфраструктура открытых ключей: easy-rsa»), но если вы собираетесь использовать сертификат для веб-сайта, вам нужно полагаться на доверенный центр сертификации. Цены на сертификаты у них значительно различаются, но можно обеспечить большую безопасность, потратив сущий мизер.

10.2.1. Создание бесплатных доверенных сертификатов

Многие программы по умолчанию создают и используют snakeoil сертификаты (для личных целей или тестирования) (см. врезку SECURITY Snake oil SSL certificates). К счастью пакет certbot содержит все необходимое для создания собственных доверенных сертификатов, предоставленных инициативой Lets Encrypt (см. врезку КУЛЬТУРА The Let's Encrypt Initiative), который также можно использовать для агентов транспорта почты (Postfix), агентов доставки почты (Dovecot, Cyrus и т. д.) и других сетевых служб.
Администраторы Falcot просто хотят создать сертификат для своего веб-сайта, работающего на Apache. Для этого есть удобный плагин Apache certbot, автоматически редактирующий конфигурацию Apache для обслуживания полученного сертификата, поэтому используют его:
# apt install python3-certbot-apache
[...]
# certbot --apache
aving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): admin@falcot.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:  N

Account registered.

No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): falcot.com

Requesting a certificate for falcot.com
Performing the following challenges:
http-01 challenge for falcot.com
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://falcot.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=falcot.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/falcot.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/falcot.com/privkey.pem
   Your cert will expire on 2022-06-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
Если вы предпочитаете, чтобы сервер работал во время создания сертификата, вы можете использовать плагин webroot для получения сертификата с аргументами certonly и --webroot . Вам нужно будет указать путь --webroot-path (сокращённо -w), по которому должны располагаться обслуживаемые файлы. Команда выглядит следующим образом:
# certbot certonly --webroot -w /var/www/html -d www.DOMAIN.com -d DOMAIN.com
Вам необходимо перезапустить все службы, использующие созданные вами сертификаты.
Создаваемые сертификаты - с коротким сроком действия (действительны в течение 90 дней) и поэтому должны продлеваться один раз в три месяца командой certbot renew. Для автоматического продления сертификатов базовое задание cron включено в certbot in /etc/cron.d/certbot. Чтобы проверить корректность автопродления сертификатов, выполните certbot renew --dry-run.

10.2.2. Инфраструктура открытых ключей: easy-rsa

Также возможно создать свой собственный CA, для этого мы будем использовать алгоритм RSA, широко используемый в криптографии с открытым ключом. Он включает в себя «пару ключей», состоящую из частного и открытого ключей. Два ключа тесно связаны друг с другом, а их математические свойства таковы, что сообщение, зашифрованное с помощью открытого ключа, может быть расшифровано только тем, кто знает закрытый ключ, что обеспечивает конфиденциальность. И наоборот, сообщение, зашифрованное с помощью закрытого ключа, может быть расшифровано любым, кто знает открытый ключ, что позволяет аутентифицировать происхождение сообщения, поскольку его может сгенерировать только тот, кто имеет доступ к закрытому ключу. В сочетании с цифровой хеш-функцией (MD5, SHA1 или более поздним вариантом) это приводит к механизму подписи, который можно применять к любому сообщению.
Поскольку общедоступные центры сертификации выдают сертификаты только за (значительную) плату, внутри компании также можно создать частный центр сертификации. Пакет easy-rsa предоставляет инструменты для работы в качестве инфраструктуры сертификации X.509, реализованные в виде набора сценариев с использованием openssl.
Администраторы Falcot Corp используют этот инструмент для создания нужных сертификатов как для сервера так и для клиентов. Что позволяет настраивать всех клиентов похожим образом, поскольку на клиентах надо только установить, чтобы они считали доверенными сертификаты, выданные локальным CA, расположенным в Falcot. Этот центр сертификации является первым создаваемым сертификатом; с этой целью администраторы создают каталог с файлами, необходимыми для CA, в соответствующем месте, предпочтительно на машине, не подключенной к сети, чтобы снизить риск кражи закрытого ключа CA.
$ make-cadir pki-falcot
$ cd pki-falcot
Затем они сохраняют в файл varsнеобходимые параметры, которые можно раскомментировать и редактировать:
$ grep EASYRSA vars
if [ -z "$EASYRSA_CALLER" ]; then
# easyrsa.  More specific variables for specific files (e.g., EASYRSA_SSL_CONF)
#set_var EASYRSA	"${0%/*}"
#set_var EASYRSA_OPENSSL	"openssl"
#set_var EASYRSA_OPENSSL	"C:/Program Files/OpenSSL-Win32/bin/openssl.exe"
#set_var EASYRSA_PKI		"$PWD/pki"
#set_var EASYRSA_TEMP_DIR	"$EASYRSA_PKI"
#set_var EASYRSA_DN	"cn_only"
set_var EASYRSA_REQ_COUNTRY	"FR"
set_var EASYRSA_REQ_PROVINCE	"Loire"
set_var EASYRSA_REQ_CITY	"Saint-Étienne"
set_var EASYRSA_REQ_ORG	"Falcot Corp"
set_var EASYRSA_REQ_EMAIL	"admin@falcot.com"
set_var EASYRSA_REQ_OU		"Certificate authority"
#set_var EASYRSA_KEY_SIZE	2048
#set_var EASYRSA_ALGO		rsa
#set_var EASYRSA_CURVE		secp384r1
#set_var EASYRSA_CA_EXPIRE	3650
#set_var EASYRSA_CERT_EXPIRE	825
#set_var EASYRSA_CRL_DAYS	180
#set_var EASYRSA_CERT_RENEW	30
#set_var EASYRSA_RAND_SN	"yes"
#set_var EASYRSA_NS_SUPPORT	"no"
#set_var EASYRSA_NS_COMMENT	"Easy-RSA Generated Certificate"
#set_var EASYRSA_TEMP_FILE	"$EASYRSA_PKI/extensions.temp"
# when undefined here, default behaviour is to look in $EASYRSA_PKI first, then
# fallback to $EASYRSA for the 'x509-types' dir.  You may override this
#set_var EASYRSA_EXT_DIR	"$EASYRSA/x509-types"
#set_var EASYRSA_KDC_REALM      "CHANGEME.EXAMPLE.COM"
# EASYRSA_PKI or EASYRSA dir (in that order.) NOTE that this file is Easy-RSA
#set_var EASYRSA_SSL_CONF	"$EASYRSA/openssl-easyrsa.cnf"
#set_var EASYRSA_REQ_CN		"ChangeMe"
#set_var EASYRSA_DIGEST		"sha256"
#set_var EASYRSA_BATCH		""
$ vim vars
$ 
Теперь мы подготавливаем каталог инфраструктуры открытых ключей следующей командой:
$ ./easyrsa init-pki


init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/debian/pki-falcot/pki

Следующим шагом является создание самой пары ключей CA (две части пары ключей будут храниться с именами keys/ca.crt и keys/ca.key). Можно добавить опцию nopass, чтобы не вводить пароль каждый раз при использовании закрытого ключа:
$ ./easyrsa build-ca nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating RSA private key, 2048 bit long modulus (2 primes)
..................+++++
...............................+++++
e is 65537 (0x010001)
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/debian/pki-falcot/pki/ca.crt

Теперь можно создать сертификат, а также параметры Диффи-Хеллмана, необходимые для серверной части соединения SSL/TLS. VPN сервер (см. секцию Раздел 10.3, «Виртуальная частная сеть») идентифицируется по его DNS имени vpn.falcot.com; это имя будет использоваться в дальнейшем для создания файлов ключей (keys/vpn.falcot.com.crt - публичный сертификат, keys/vpn.falcot.com.key - закрытый ключ):
$ ./easyrsa gen-req vpn.falcot.com nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating a RSA private key
......................................+++++
..........................................................................+++++
writing new private key to '/home/debian/pki-falcot/pki/easy-rsa-5515.0PwyXl/tmp.g1c6u6'
-----
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.
-----
Common Name (eg: your user, host, or server name) [vpn.falcot.com]:

Keypair and certificate request completed. Your files are:
req: /home/debian/pki-falcot/pki/reqs/vpn.falcot.com.req
key: /home/debian/pki-falcot/pki/private/vpn.falcot.com.key


$ ./easyrsa sign-req server vpn.falcot.com

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = vpn.falcot.com


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/debian/pki-falcot/pki/easy-rsa-5603.87iCIa/tmp.u8r8Fj
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn.falcot.com'
Certificate is to be certified until May 27 15:26:29 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/debian/pki-falcot/pki/issued/vpn.falcot.com.crt


$ ./easyrsa gen-dh

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[…]

DH parameters of size 2048 created at /home/debian/pki-falcot/pki/dh.pem

Следующим шагом создаются сертификаты для клиентов VPN; один сертификат нужен каждому компьютеру или лицу, которым позволено использовать VPN:
$ ./easyrsa build-client-full JoeSmith nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating a RSA private key
...................................+++++
.........................................................................................+++++
writing new private key to '/home/debian/pki-falcot/pki/easy-rsa-5694.DOYwSn/tmp.RKlbOE'
-----
Using configuration from /home/debian/pki-falcot/pki/easy-rsa-5694.DOYwSn/tmp.d5QHAC
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'JoeSmith'
Certificate is to be certified until May 27 15:29:25 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated