Модуль 3. Задание 4.¶
Решение¶
ГОСТ
Отечественные алгоритмы в задании только рекомендуются. Сайт с ГОСТ-сертификатом откроется в Яндекс Браузере или Chromium только с установленным КриптоПро CSP, иначе будет ошибка. Поэтому основной вариант делаем на RSA, а ГОСТ разобран в конце страницы.
HQ-SRV¶
Создаём папку центра сертификации:
mkdir -p /root/ca
cd /root/ca
Корневой сертификат центра на 30 дней:
openssl req -x509 -newkey rsa:2048 -nodes -keyout ca.key -out ca.crt -days 30 -subj "/CN=AU-TEAM CA"
Сертификаты для веб-серверов, тоже на 30 дней. Без subjectAltName браузер будет ругаться на имя, поэтому задаём его через файл расширений:
openssl req -newkey rsa:2048 -nodes -keyout web.key -out web.csr -subj "/CN=web.au-team.irpo"
echo "subjectAltName=DNS:web.au-team.irpo" > web.ext
openssl x509 -req -in web.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 30 -extfile web.ext -out web.crt
openssl req -newkey rsa:2048 -nodes -keyout docker.key -out docker.csr -subj "/CN=docker.au-team.irpo"
echo "subjectAltName=DNS:docker.au-team.irpo" > docker.ext
openssl x509 -req -in docker.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 30 -extfile docker.ext -out docker.crt
Проверка:
openssl verify -CAfile ca.crt web.crt docker.crt
openssl x509 -in web.crt -noout -dates -ext subjectAltName
Кладём сертификаты в домашнюю папку sshuser, оттуда их потом заберём на ISP и HQ-CLI:
mkdir -p /home/sshuser/certs
cp ca.crt web.crt web.key docker.crt docker.key /home/sshuser/certs/
chown -R sshuser /home/sshuser/certs
ISP¶
Забираем сертификаты через проброс 2027 порта на HQ-RTR (модуль 2, задание 8), пароль P@ssw0rd:
mkdir -p /etc/nginx/ssl
scp -P 2027 '[email protected]:certs/*' /etc/nginx/ssl/
Переводим прокси на https, с http делаем редирект:
server {
listen 443 ssl;
server_name web.au-team.irpo;
ssl_certificate /etc/nginx/ssl/web.crt;
ssl_certificate_key /etc/nginx/ssl/web.key;
location / {
auth_basic "web";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://172.16.1.2:8080;
}
}
server {
listen 443 ssl;
server_name docker.au-team.irpo;
ssl_certificate /etc/nginx/ssl/docker.crt;
ssl_certificate_key /etc/nginx/ssl/docker.key;
location / {
proxy_pass http://172.16.2.2:8080;
}
}
server {
listen 80;
server_name web.au-team.irpo docker.au-team.irpo;
return 301 https://$host$request_uri;
}
Проверяем конфигурацию и перезапускаем nginx:
nginx -t
nginx -s reload
HQ-CLI¶
Добавляем корневой сертификат в системные доверенные:
scp -P 2027 [email protected]:certs/ca.crt /etc/pki/ca-trust/source/anchors/au-team-ca.crt
update-ca-trust
Яндекс Браузер системное хранилище подхватывает не всегда, поэтому добавляем сертификат ещё и в его хранилище. Команду выполняем от пользователя, под которым открываем браузер:
Пакет
Для certutil может потребоваться пакет nss-utils.
apt-get update && apt-get install -y nss-utils
certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "AU-TEAM CA" -i /etc/pki/ca-trust/source/anchors/au-team-ca.crt
Это же можно сделать в настройках браузера: управление сертификатами -> центры сертификации -> импорт ca.crt с галочкой доверия для сайтов. После этого перезапускаем браузер.
Проверка, web должен ответить 401, т.к. там стоит авторизация:
curl -I https://web.au-team.irpo
curl -I https://docker.au-team.irpo
Затем открываем в браузере https://web.au-team.irpo и https://docker.au-team.irpo, предупреждений быть не должно.
DNS
Если HQ-CLI после модуля 2 ходит за DNS на BR-SRV, записи web и docker нужно добавить в DNS домена, см. задание 2-3.
Вариант с ГОСТ¶
Нужен, только если эксперт требует ГОСТ. Без КриптоПро CSP браузер такой сертификат не примет, поэтому ГОСТ добавляем в дополнение к RSA. Nginx сам отдаст ГОСТ тем клиентам, которые его поддерживают, а остальным RSA.
На HQ-SRV и ISP включаем поддержку ГОСТ в OpenSSL:
apt-get update && apt-get install -y openssl-gost-engine
control openssl-gost enabled
HQ-SRV¶
Отдельный корневой сертификат ГОСТ Р 34.10-2012:
cd /root/ca
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:TCB -out ca-gost.key
openssl req -new -x509 -md_gost12_256 -days 30 -key ca-gost.key -out ca-gost.crt -subj "/CN=AU-TEAM GOST CA"
Сертификат для web (для docker то же самое с заменой имени):
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out web-gost.key
openssl req -new -md_gost12_256 -key web-gost.key -out web-gost.csr -subj "/CN=web.au-team.irpo"
openssl x509 -req -in web-gost.csr -CA ca-gost.crt -CAkey ca-gost.key -CAcreateserial -days 30 -extfile web.ext -out web-gost.crt
Кладём их туда же, куда и RSA:
cp ca-gost.crt web-gost.crt web-gost.key docker-gost.crt docker-gost.key /home/sshuser/certs/
chown -R sshuser /home/sshuser/certs
ISP¶
Забираем файлы тем же scp, что и выше, и в каждый server с listen 443 добавляем вторую пару сертификатов и ГОСТ шифры. Пример для web:
ssl_certificate /etc/nginx/ssl/web-gost.crt;
ssl_certificate_key /etc/nginx/ssl/web-gost.key;
ssl_ciphers GOST2012-GOST8912-GOST8912:HIGH:MEDIUM;
nginx -t
nginx -s reload
HQ-CLI¶
ca-gost.crt добавляем в доверенные так же, как ca.crt. ГОСТ соединение проверяется через OpenSSL с включённым openssl-gost-engine:
openssl s_client -connect web.au-team.irpo:443 -servername web.au-team.irpo -tls1_2 -cipher GOST2012-GOST8912-GOST8912 < /dev/null