Настроить корневой центр сертификации (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
И соответственно, никакой ругани о недостоверном сертификате в консоли при работе с консольными wget или curl:
curl https://kibana -I HTTP/1.1 200 OK Server: nginx ... ...
Вот так просто настраивается корневой центр сертификации для внутреннего пользования.