В интернет можно найти сотни статей о том как выпустить и устанавить ssl сертификат в linux. Эта шпаргалка из личного опыта, самое важное, что может пригодится для генерации сертификатов в корпоративной среде. А именно создание ключа, запроса сертификата, подпись сертификата доменным центром сертификации. Помимо этого сертификат должен отвечать современным требованиям браузеров, а поэтому содержать дополнительные поля.
Все команды и размещения конфигурационных файлов будут на примере дистрибутива Ubuntu. Шпаргалка в первую очередь для себя, ну и может кому будет полезна.
Настройка дополнительных полей SSL сертификата в Linux
Первым делом необходимо настроить список и значения дополнительных полей в сертификате, а именно Subject Alternative Names. Указывать их необходимо, чтобы избежать ошибки [missing_subjectAltName] и NET::ERR_CERT_COMMON_NAME_INVALID в Google Chrome и других браузерах. В данных полях необходимо перечислить все dns имена и ip адреса, по которым может быть открыт сайт.
Задаются параметры через файл /etc/ssl/openssl.cnf. Если у вас данный конфигурационный файл не изменялся то необходимо внести следующие изменения:
- В разделе [req] добавить строку: req_extensions = v3_req
- В разделе [v3_req] добавить строку: subjectAltName = @alt_names
- Создать раздел [ 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 бит. Вы можете изменить эти параметры по своему усмотрению. Далее последует диалог, в котором необходимо указать основные поля сертификата.

Обратите внимание на поле Common Name такое же имя стоит прописать в конфиге выше в качестве одного из полей в alt_names.
Если пришло время и вы обновляете сертификат, то выпустить запрос можно получив информацию из существующего сертификата:
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csrПодпись ssl сертификата linux в доменном центре сертификации
Копируем содержимое csr файла в буфер, затем идем на веб сайт доменного центра сертификации.




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

Кликаем по ссылке «Загрузить сертификат» и сохраняем файл сертификата. После этого его можно загрузить на сервер и настроить на использование вебсервером.
Поскольку доменный центр сертификации по умолчанию распространяет свой корневой сертификат на все машины в домене Active Directory, либо вы сделали это с помощью GPO, то все подписанные им сертификаты на машинах в домене будут валидными. Таким образом и SSL сертификат в Linux подписанный доменным центром сертификации прикрученный к внутрикорпоративному веб-серверу тоже не вызовет ошибок в браузере на рабочей машине пользователя.
Данная инструкция пригодится при выпуске сертификата например для установки на Proxmox Mail Gateway или любой другой веб-сервер.
Установка корневого сертификата на сервере (Ubuntu)
Прежде всего сохраните сертификат в base64 формате. Сделать это можно при экспорте из консоли управления сертификатами в windows либо с помощью команды:
openssl x509 -outform der -in CAroot.pem -out CAroot.crt Обратите внимание, что расширение файла в base64 формате обязательно должно быть crt. Затем необходимо скопировать файл в папку /usr/local/share/ca-certificates
sudo cp CAroot.crt /usr/local/share/ca-certificatesИ обновить список сертификатов в системе с помощью команды:
sudo update-ca-certificatesКонвертирование сертификата и ключа в PKCS#12 в Linux
Чтобы конвертировать в Linux файл сертификата и ключ в формат PKCS12 необходимо выполнить 2 команды (в случае если сертификат в DER формате.
Первая команда конвертирует сертификат в формат PEM:
openssl x509 -in certificate.cer -inform DER -out certificate.pem -outform PEMВторая команда объединяет сертификат и закрытый ключ в файл p12:
openssl pkcs12 -export -out cert_plus_key.p12 -inkey application.key -in certificate.pemЕсли сертификат уже в PEM формате то достаточно только второй команды. При её выполнении будет запрошен пароль на pkcs12 файл.
Другие полезные команды 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/
Мониторинг SSL сертификата в Zabbix — с использованием встроенных средств Zabbix.
Как всегда дополнения и конструктивная критика приветствуются в комментариях.
 
 







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