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

Настроить корневой центр сертификации (CA) для внутренего пользования, без фанатизма с безопасностью довольно просто. В идеале все это нужно держать на машине, которая включается только для генерации нового ключа. Машина не подключена к интернет, и передача данных идет через флешку.  В идеале 🙂

 

Подготовка:

export OPENSSL_CONF=${HOME}/ssl/TW/ca.conf
export HOME=${HOME}/ssl/TW
export TMPDIR=${HOME}/temp

 

Создаем нужные файлы:

touch -f ~/.rnd ~/oid_list.txt ~/certdb.txt
echo "01" > ~/.certserial
echo "01" > ~/.crlserial

mkdir -p ~/bin ~/archive ~/store/keys ~/tmp

 

далее заполняем конфиг. По сути интересны для правки могут быть всего несколько строк. В начале HOME — путь к папке с сертификатами, и в самом низу секция org1_dn

HOME = /home/SSLCAUSER/ssl/PROJECTNAME
TMPDIR = ${ENV::HOME}/tmp

MCA_WEBSITE = ca

MCA_KEYLEN = 2048
MCA_KEYAGE = 3650

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 = sha512
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 = XX
countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or province name (optional)

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

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

organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = MiniCA

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

emailAddress = Email Address (mandatory)
emailAddress_max = 40


[ org1_attr ]
#challengePassword = A challenge password
#challengePassword_min = 4
#challengePassword_max = 20

 

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

openssl req -newkey rsa:4096 -x509 -extensions x509_ca -keyout ~/ca.key -out ~/store/ca-$(date +%Y%m%d-%H%M).crt -days 3654
ln -fs /home/os/ssl/TW/store/ca-20120611-2310.crt ~/ca.crt

Файл ca.crt — необходимо импортировать в браузер которым пользуетесь, в доверенные издатели.

Теперь можем начать выпускать сертификаты для наших внутренних доменов.

cert=kibana

SSLSAN='email:a1@a2.com,DNS:kibana,DNS:kibana.companydomain.local' openssl req -new -reqexts x509_server_req -keyout ~/store/keys/$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 keys/$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/keys/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 ca

 

И соответственно, никакой ругани о недостоверном сертификате в консоли при работе с консольными wget или curl:

curl https://kibana -I
HTTP/1.1 200 OK
Server: nginx
...
...

 

Вот так просто настраивается корневой центр сертификации для внутреннего пользования.

 

Другие новости
21.05.2019
Настойка satis для пакетов composer в docker

Настрройка satis satis — кеширующий сервер для пакетов php composer. Для настройки репозитория будем использовать официальный docker. Разработчикам понадобится редактировать файла конфигурации satis.json, для этого поднимем отдельный контейнер с sftp и ftp серверами внутри. Файл конфиргурации в нашем случае должен

27.07.2018
Лечим wordpress https err_too_many_redirects

По какой логике wordpress понимает что к нему пришел https не понятно, но часто сталкиваемся с проблемой когда стили и js вордпресс отдает  по http и изза mixed content браузеры их режут. Если в настройках (Настройки -> Общие) жестко указали