SSL сертификат в Linux

SSL сертификат в Linux Linux

В интернет можно найти сотни статей о том как выпустить и устанавить ssl сертификат в linux. Эта шпаргалка из личного опыта, самое важное, что может пригодится для генерации сертификатов в корпоративной среде. А именно создание ключа, запроса сертификата, подпись сертификата доменным центром сертификации. Помимо этого сертификат должен отвечать современным требованиям браузеров, а поэтому содержать дополнительные поля.

Все команды и размещения конфигурационных файлов будут на примере дистрибутива Ubuntu. Шпаргалка в первую очередь для себя, ну и может кому будет полезна.

Настройка дополнительных полей SSL сертификата в Linux

Первым делом необходимо настроить список и значения дополнительных полей в сертификате, а именно Subject Alternative Names. Указывать их необходимо, чтобы избежать ошибки [missing_subjectAltName] и NET::ERR_CERT_COMMON_NAME_INVALID в Google Chrome и других браузерах. В данных полях необходимо перечислить все dns имена и ip адреса, по которым может быть открыт сайт.

Задаются параметры через файл /etc/ssl/openssl.cnf. Если у вас данный конфигурационный файл не изменялся то необходимо внести следующие изменения:

  1. В разделе [req] добавить строку: req_extensions = v3_req
  2. В разделе [v3_req] добавить строку: subjectAltName = @alt_names
  3. Создать раздел [ alt_names ] и добавить в него все альтернативные имена в формате:
DNS.1 = hostname.example.ru
IP.1 = 192.168.1.100

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

HOME                    = .
 RANDFILE                = $ENV::HOME/.rnd
 oid_section             = new_oids
 
[ new_oids ]
 tsa_policy1 = 1.2.3.4.1
 tsa_policy2 = 1.2.3.4.5.6
 tsa_policy3 = 1.2.3.4.5.7

 [ ca ]
 default_ca      = CA_default            # The default ca section

 [ CA_default ]
 dir             = ./demoCA              # Where everything is kept
 certs           = $dir/certs            # Where the issued certs are kept
 crl_dir         = $dir/crl              # Where the issued crl are kept
 database        = $dir/index.txt        # database index file.
 new_certs_dir   = $dir/newcerts         # default place for new certs.
 certificate     = $dir/cacert.pem       # The CA certificate
 serial          = $dir/serial           # The current serial number
 crlnumber       = $dir/crlnumber        # the current crl number
 crl             = $dir/crl.pem          # The current CRL
 private_key     = $dir/private/cakey.pem# The private key
 RANDFILE        = $dir/private/.rand    # private random number file
 x509_extensions = usr_cert              # The extensions to add to the cert
 name_opt        = ca_default            # Subject Name options
 cert_opt        = ca_default            # Certificate field options
 default_days    = 365                   # how long to certify for
 default_crl_days= 30                    # how long before next CRL
 default_md      = default               # use public key default MD
 preserve        = no                    # keep passed DN ordering
 policy          = policy_match

 [ policy_match ]
 countryName             = match
 stateOrProvinceName     = match
 organizationName        = match
 organizationalUnitName  = optional
 commonName              = supplied
 emailAddress            = optional

 [ policy_anything ]
 countryName             = optional
 stateOrProvinceName     = optional
 localityName            = optional
 organizationName        = optional
 organizationalUnitName  = optional
 commonName              = supplied
 emailAddress            = optional

 [ req ]
 default_bits            = 2048
 default_keyfile         = privkey.pem
 distinguished_name      = req_distinguished_name
 attributes              = req_attributes
 x509_extensions = v3_ca # The extensions to add to the self signed cert
 string_mask = utf8only
 req_extensions = v3_req # The extensions to add to a certificate request

 [ 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     = Tyumen
 localityName                    = Locality Name (eg, city)
 0.organizationName              = Organization Name (eg, company)
 0.organizationName_default      = Roga&Kopyta,Ltd
 organizationalUnitName          = Organizational Unit Name (eg, section)
 organizationalUnitName_default  = IT
 commonName                      = Common Name (e.g. server FQDN or YOUR name)
 commonName_max                  = 64
 emailAddress                    = Email Address
 emailAddress_max                = 64

 [ req_attributes ]
 challengePassword               = A challenge password
 challengePassword_min           = 4
 challengePassword_max           = 20
 unstructuredName                = An optional company name

 [ usr_cert ]
 basicConstraints=CA:FALSE
 nsComment                       = "OpenSSL Generated Certificate"
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid,issuer

 [ v3_req ]
 basicConstraints = CA:FALSE
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment
 subjectAltName = @alt_names

 [ v3_ca ]
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid:always,issuer
 basicConstraints = critical,CA:true

 [ crl_ext ]
 authorityKeyIdentifier=keyid:always

 [ proxy_cert_ext ]
 basicConstraints=CA:FALSE
 nsComment                       = "OpenSSL Generated Certificate"
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid,issuer
 proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo

 [ tsa ]
 default_tsa = tsa_config1       # the default TSA section

 [ tsa_config1 ]
 dir             = ./demoCA              # TSA root directory
 serial          = $dir/tsaserial        # The current serial number (mandatory)
 crypto_device   = builtin               # OpenSSL engine to use for signing
 signer_cert     = $dir/tsacert.pem      # The TSA signing certificate
 certs           = $dir/cacert.pem       # Certificate chain to include in reply
 signer_key      = $dir/private/tsakey.pem # The TSA private key (optional)
 signer_digest  = sha256                 # Signing digest to use. (Optional)
 default_policy  = tsa_policy1           # Policy if request did not specify it
 other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional)
 digests     = sha1, sha256, sha384, sha512  # Acceptable message digests (mandatory)
 accuracy        = secs:1, millisecs:500, microsecs:100  # (optional)
 clock_precision_digits  = 0     # number of digits after dot. (optional)
 ordering                = yes   # Is ordering defined for timestamps?
 tsa_name                = yes   # Must the TSA name be included in the reply?
 ess_cert_id_chain       = no    # Must the ESS cert id chain be included?

 [ alt_names ]
 DNS.1 = hostname.example.ru
 DNS.2 = hostname2.example.ru
 IP.1 = 192.168.1.100

Запрос SSL сертификата в Linux

После того как отредактировали файл создаем ключ и запрос в одной команде:

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr

Эта команда создаст файл закрытого ключа типа rsa длиной 2048 бит. Вы можете изменить эти параметры по своему усмотрению. Далее последует диалог, в котором необходимо указать основные поля сертификата.

Создание запроса ssl сертификата в Linux
Поле Common Name должно совпадать с именем хоста к которому вы выпускаете сертификат

Обратите внимание на поле Common Name такое же имя стоит прописать в конфиге выше в качестве одного из полей в alt_names.

Если пришло время и вы обновляете сертификат, то выпустить запрос можно получив информацию из существующего сертификата:

openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr

Подпись ssl сертификата linux в доменном центре сертификации

Копируем содержимое csr файла в буфер, затем идем на веб сайт доменного центра сертификации.

Первый шаг подписи сертификата доменным центром сертификации
Кликаем ссылку запрос сертификата
Подпись сертификата через расширенный запрос
На следующем шаге кликаем ссылку «расширенный запрос сертификата»
Как подписать ssl сертификат linux доменным центром сертификации
Выдать запрос используя файл запроса
Подпись запроса ssl сертификата созданного в Linux доменным центром сертификации для веб-сервера
Вставляем скопированный ранее запрос в поле Base-64-шифрованный запрос сертификата

В поле шаблон сертификата выбираем Веб-сервер и кликаем по кнопке «Выдать».

Скачивание ssl сертификата с сайта доменного центра сертификации
Переключаем формат сертификата в Base64

Кликаем по ссылке «Загрузить сертификат» и сохраняем файл сертификата. После этого его можно загрузить на сервер и настроить на использование вебсервером.

Поскольку доменный центр сертификации по умолчанию распространяет свой корневой сертификат на все машины в домене Active Directory, либо вы сделали это с помощью GPO, то все подписанные им сертификаты на машинах в домене будут валидными. Таким образом и SSL сертификат в Linux подписанный доменным центром сертификации прикрученный к внутрикорпоративному веб-серверу тоже не вызовет ошибок в браузере на рабочей машине пользователя.

Данная инструкция пригодится при выпуске сертификата например для установки на Proxmox Mail Gateway или любой другой веб-сервер.

Установка корневого сертификата на сервере (Ubuntu)

Прежде всего сохраните сертификат в base64 формате. Сделать это можно при экспорте из консоли управления сертификатами в windows либо с помощью команды:

openssl x509 -outform der -in CAroot.pem -out CAroot.crt 

Обратите внимание, что расширение файла в der формате обязательно должно быть crt. Затем необходимо скопировать файл в папку /usr/local/share/ca-certificates

sudo cp CAroot.crt /usr/local/share/ca-certificates

И обновить список сертификатов в системе с помощью команды:

sudo update-ca-certificates

Другие полезные команды openssl

Создание закрытого ключа:

openssl genrsa -des3 -out domain.key 2048

Создание запроса на основе имеющегося ключа:

openssl req -key domain.key -new -out domain.csr

Просмотр сертификата:

openssl req -text -noout -verify -in domain.csr

Генерация паролей с помощью openssl:

openssl rand -base64 9

Больше информации по OpenSSl https://www.openssl.org/docs/

Как всегда дополнения и конструктивная критика приветствуются в комментариях.

Оцените статью
Добавить комментарий

Внимание! Нажимая кнопку "Отправить комментарий" вы соглашаетесь с политикой конфиденциальности сайта.