Настройка собственного корневого центра сертификации openssl ca — Администрирование devops сопровождение проектов

Настройка собственного корневого центра сертификации openssl ca

Настроить корневой центр сертификации (CA) для внутренего пользования, без фанатизма с безопасностью довольно просто. В идеале все это нужно держать на машине, которая включается только для генерации нового ключа. Машина не подключена к интернет, и передача данных идет через флешку.  В идеале 🙂 Подготовка:
export OPENSSL_CONF=${HOME}/ssl/CASP/ca.conf
export HOME=${HOME}/ssl/CASP
export TMPDIR=${HOME}/temp
Создаем нужные файлы:
touch -f ~/.rnd ~/oid_list.txt ~/certdb.txt
echo \"01\" > ~/.certserial
echo \"01\" > ~/.crlserial

mkdir -p ~/bin ~/archive ~/store ~/tmp
далее заполняем конфиг. По сути интересны для правки могут быть всего несколько строк. В начале HOME — путь к папке с сертификатами, и в самом низу секция org1_dn
HOME = /home/SSLCAUSER/ssl/PROJECTNAME
TMPDIR = ${ENV::HOME}/tmp

MCA_WEBSITE = ca

MCA_KEYLEN = 2048
MCA_KEYAGE = 365

SSLSAN = email:copy


[ ca ]

default_ca = org1


[ org1 ]

RANDFILE = ${ENV::HOME}/.rnd
certificate = ${ENV::HOME}/ca.crt
private_key = ${ENV::HOME}/ca.key

new_certs_dir = ${ENV::HOME}/archive

oid_file = ${ENV::HOME}/oid_list.txt
database = ${ENV::HOME}/certdb.txt
serial = ${ENV::HOME}/.certserial
crlnumber = ${ENV::HOME}/.crlserial

default_days = ${ENV::MCA_KEYAGE}
default_crl_days = 31
default_md = sha256
unique_subject = no

preserve = no
email_in_dn = no
#name_opt
#cert_opt
copy_extensions = copy
x509_extensions = x509_client
crl_extensions = org1_CRLext
policy = org1_policy


[ req ]
oid_file = ${org1::oid_file}
default_bits = ${ENV::MCA_KEYLEN}
RANDFILE = ${org1::RANDFILE}
default_md = ${org1::default_md}
string_mask = nombstr

#prompt = no
#utf8 = yes

x509_extensions = x509_client
req_extensions = x509_client_req
distinguished_name = org1_dn
attributes = org1_attr


[ x509_base ]
#basicConstraints = critical, CA:FALSE, pathlen:0
#keyUsage = critical, digitalSignature, dataEncipherment
#extendedKeyUsage = serverAuth, emailProtection
subjectKeyIdentifier = hash
subjectAltName = ${ENV::SSLSAN}
authorityKeyIdentifier = keyid:always,issuer:always
issuerAltName = issuer:copy
authorityInfoAccess = caIssuers;URI:https://${MCA_WEBSITE}/ca.cer
crlDistributionPoints = URI:https://${MCA_WEBSITE}/ca.crl


[ x509_ca ]
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
#extendedKeyUsage =
subjectKeyIdentifier = ${x509_base::subjectKeyIdentifier}
subjectAltName = ${x509_base::subjectAltName}
authorityKeyIdentifier = ${x509_base::authorityKeyIdentifier}
issuerAltName = ${x509_base::issuerAltName}
authorityInfoAccess = ${x509_base::authorityInfoAccess}
crlDistributionPoints = ${x509_base::crlDistributionPoints}


[ x509_server ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth, emailProtection
subjectKeyIdentifier = ${x509_base::subjectKeyIdentifier}
authorityKeyIdentifier = ${x509_base::authorityKeyIdentifier}
issuerAltName = ${x509_base::issuerAltName}
authorityInfoAccess = ${x509_base::authorityInfoAccess}
crlDistributionPoints = ${x509_base::crlDistributionPoints}

[ x509_server_req ]
basicConstraints = ${x509_server::basicConstraints}
keyUsage = ${x509_server::keyUsage}
extendedKeyUsage = ${x509_server::extendedKeyUsage}
subjectKeyIdentifier = ${x509_server::subjectKeyIdentifier}
subjectAltName = ${x509_base::subjectAltName}

[ x509_client ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, nonRepudiation, dataEncipherment
extendedKeyUsage = clientAuth, emailProtection, codeSigning
subjectKeyIdentifier = ${x509_base::subjectKeyIdentifier}
authorityKeyIdentifier = ${x509_base::authorityKeyIdentifier}
issuerAltName = ${x509_base::issuerAltName}
authorityInfoAccess = ${x509_base::authorityInfoAccess}
crlDistributionPoints = ${x509_base::crlDistributionPoints}

[ x509_client_req ]
basicConstraints = ${x509_client::basicConstraints}
keyUsage = ${x509_client::keyUsage}
extendedKeyUsage = ${x509_client::extendedKeyUsage}
subjectKeyIdentifier = ${x509_client::subjectKeyIdentifier}
subjectAltName = ${x509_base::subjectAltName}

[ org1_CRLext ]
authorityKeyIdentifier=${x509_base::authorityKeyIdentifier}
authorityInfoAccess = ${x509_base::authorityInfoAccess}
crlDistributionPoints = ${x509_base::crlDistributionPoints}

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

[ org1_dn ]
countryName = Country Name (2 letter code, mandatory)
countryName_default = RU
countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or province name (optional)

localityName = Locality Name (eg, city, mandatory)
localityName_default = RU

organizationName = Organization name (optional)
organizationName_default = CASP corp.

organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = Casp.ru DevOps commandos

commonName = Common Name (eg, YOUR name, or a server address)
commonName_default = fqdn_in_alt_names
commonName_max = 64

emailAddress = Email Address (mandatory)
emailAddress_default = admin@casp.ru
emailAddress_max = 40


[ org1_attr ]
#challengePassword = A challenge password
#challengePassword_min = 4
#challengePassword_max = 20
Далее генерируем корневой сертификат и ключ. Пароль должен быть надежным.
openssl req -newkey rsa:2048 -x509 -extensions x509_ca -keyout ~/ca.key -out ~/store/ca-$(date +%Y%m%d).crt -days 3600
ln -fs store/ca-$(date +%Y%m%d).crt ~/ca.crt
Файл ca.crt — необходимо импортировать в браузер которым пользуетесь, в доверенные издатели и в саму. Теперь можем начать выпускать сертификаты для наших внутренних доменов.
cert=kibana

SSLSAN=\"email:admin@casp.ru,DNS:kibana,DNS:kibana.companydomain.local,DNS:$cert\"

openssl req -new -reqexts x509_server_req -keyout ~/store/$cert.key -out ~/store/$cert.csr -nodes
openssl ca -extensions x509_server -in ~/store/$cert.csr -out ~/store/$cert.crt

Все готово. Чтобы быстро перенести эти два файла на веб сервер можно воспользоваться двумя командами. Первая выполняется на сервере с сертификатом, в корневой папке сертификатов, вторая — на веб сервере, куда необходимо установить сертификат. Вторая команда на вход принимает вывод первой.
(cd store; tar cvz $cert.crt $cert.key |base64 -w180)

cd /path/webserver/ssldir; base64 -d | tar xvz
Чтобы получить сертификат в формате pfx — выполните следующее:
openssl pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt
Далее подключаем его в веб сервере, например в nginx.
listen 10.20.30.40:443 ssl;

ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # SSLv3 исключить CVE-2014-3566
ssl_certificate_key /etc/nginx/ssl/wiki.key;
ssl_certificate /etc/nginx/ssl/wiki.crt;
После этого нужно добавить наш ca.crt в доверенные центры сертификации в браузер и систему. В системе от рута:
cat ca.сrt > /etc/pki/ca-trust/source/anchors/myca.pem
update-ca-trust
В браузере — так же просто. Для примера в хроме открываем урл chrome://settings/certificates, далее \»Центры сертификации\» — Импорт. Если все сделано правильно, после перезагрузки веб сервера мы увидим зеленый замочек на сайте для которого был выпущен сертификат! Увидеть мы должны следующее: openssl ca \"openssl И соответственно, никакой ругани о недостоверном сертификате в консоли при работе с консольными wget или curl:
curl https://kibana -I
HTTP/1.1 200 OK
Server: nginx
...
...
Вот так просто настраивается корневой центр сертификации для внутреннего пользования.
Другие новости
03.08.2024
Сервер упал «вчера» или назад в будущее. Настраиваем atop!

Всем привет доброго лета! Задача из уст заказчика звучала следующим образом : \»мониторинг яндекса сказал что сайт не работает, при этом сервер пингуется\». Ну первым делом лезу на подвластный мне сервер, смотрю логи : аптайм 100 дней, перезагрузок не было

Хранение конфигурационных файлов в Git (Gitlab)

Было время не хранил я ничего в гите, и было это не торт. Один неверный символ мог съесть уйму времени! Годы шли и однажды прислушался к совету друга программиста использовать гитлаб.   Сервисы которые по своей идеологии не пересекаются я