#!/bin/bash
# Установка корня GlobalSign Root R46 (нужен для https://ecp18.is-mis.ru на Astra Linux / РЕД ОС).
# Запуск от root/sudo: система + браузеры всех пользователей. Без sudo: только браузеры текущего пользователя.
set -u
PIN="4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9"
NAME="GlobalSign Root R46"
URL="https://secure.globalsign.com/cacert/rootr46.crt"
SITE_IP="172.17.1.153"; SITE="ecp18.is-mis.ru"
say(){ echo "[R46] $*"; }
die(){ echo "[R46] ОШИБКА: $*" >&2; exit 1; }

T=$(mktemp -d) || die "mktemp"; trap 'rm -rf "$T"' EXIT
fp(){ openssl x509 -in "$1" -noout -fingerprint -sha256 2>/dev/null | cut -d= -f2; }

# 1. получить корень (GlobalSign, запасной путь - цепочка с самого сайта) и сверить отпечаток
got=0
if command -v curl >/dev/null; then curl -fsSL --max-time 20 "$URL" -o "$T/r.der" 2>/dev/null && got=1
elif command -v wget >/dev/null; then wget -q -T 20 "$URL" -O "$T/r.der" 2>/dev/null && got=1; fi
if [ $got = 1 ] && openssl x509 -inform DER -in "$T/r.der" -out "$T/r46.pem" 2>/dev/null && [ "$(fp "$T/r46.pem")" = "$PIN" ]; then
  say "корень скачан с GlobalSign, отпечаток совпал"
else
  say "скачать с GlobalSign не вышло, беру из цепочки сайта"
  echo | timeout 15 openssl s_client -connect $SITE_IP:443 -servername $SITE -showcerts 2>/dev/null \
    | awk '/BEGIN CERT/{n++} n>=1{print > ("'"$T"'/c" n ".pem")}'
  rm -f "$T/r46.pem"
  for c in "$T"/c?.pem; do [ -f "$c" ] && [ "$(fp "$c")" = "$PIN" ] && cp "$c" "$T/r46.pem"; done
  [ -s "$T/r46.pem" ] || die "корень с нужным отпечатком не найден - ничего не установлено"
  say "корень взят из цепочки сайта, отпечаток совпал"
fi

# 2. системное хранилище (только root)
if [ "$(id -u)" = 0 ]; then
  if [ -d /usr/local/share/ca-certificates ] || command -v update-ca-certificates >/dev/null; then
    install -D -m 644 "$T/r46.pem" /usr/local/share/ca-certificates/GlobalSign_Root_R46.crt
    update-ca-certificates >/dev/null 2>&1 && say "системное хранилище обновлено (Astra/Debian)"
  elif command -v update-ca-trust >/dev/null; then
    install -D -m 644 "$T/r46.pem" /etc/pki/ca-trust/source/anchors/GlobalSign_Root_R46.crt
    update-ca-trust extract && say "системное хранилище обновлено (РЕД ОС)"
  else say "не нашёл update-ca-certificates / update-ca-trust, системный шаг пропущен"; fi
else
  say "запущено без sudo: системное хранилище пропущено (только браузер пользователя $(id -un))"
fi

# 3. NSS-база браузеров (Яндекс, Chromium)
if ! command -v certutil >/dev/null && [ "$(id -u)" = 0 ]; then
  say "ставлю certutil"
  if command -v apt-get >/dev/null; then apt-get install -y libnss3-tools 2>&1 | tail -n 4
  elif command -v dnf >/dev/null; then dnf install -y nss-tools 2>&1 | tail -n 4
  elif command -v yum >/dev/null; then yum install -y nss-tools 2>&1 | tail -n 4; fi
  command -v certutil >/dev/null || say "certutil поставить не удалось (нет доступа к репозиторию?)"
fi
if command -v certutil >/dev/null; then
  if [ "$(id -u)" = 0 ]; then
    if [ -n "${SUDO_USER:-}" ] && [ "$SUDO_USER" != root ]; then homes=$(getent passwd "$SUDO_USER" | cut -d: -f6)
    else homes=$(ls -d /home/*/ 2>/dev/null); fi
  else homes="$HOME"; fi
  chmod 644 "$T/r46.pem"; chmod 755 "$T"
  for h in $homes; do
    h=${h%/}; u=$(stat -c %U "$h" 2>/dev/null) || continue
    db="$h/.pki/nssdb"
    run(){ if [ "$(id -u)" = 0 ]; then runuser -u "$u" -- "$@" 2>/dev/null || su -s /bin/sh "$u" -c "$(printf '%q ' "$@")"; else "$@"; fi; }
    [ -d "$db" ] || { [ -d "$h/.config/yandex-browser" ] || [ -d "$h/.config/chromium" ] || [ -d "$h/.config/google-chrome" ] || continue
                      run mkdir -p "$db"; run certutil -d sql:"$db" -N --empty-password; }
    [ -d "$db" ] || continue
    if run certutil -d sql:"$db" -L 2>/dev/null | grep -q "$NAME"; then say "$u: уже есть в базе браузера"
    else run certutil -d sql:"$db" -A -t "C,," -n "$NAME" -i "$T/r46.pem" && say "$u: добавлено в базу браузера"; fi
  done
else
  say "certutil нет - автоматически добавить корень в Яндекс/Chromium нельзя"
  if [ "$(id -u)" = 0 ]; then
    if [ -n "${SUDO_USER:-}" ] && [ "$SUDO_USER" != root ]; then homes=$(getent passwd "$SUDO_USER" | cut -d: -f6)
    else homes=$(ls -d /home/*/ 2>/dev/null); fi
  else homes="$HOME"; fi
  for h in $homes; do
    h=${h%/}; [ -d "$h" ] || continue
    f="$h/GlobalSign_Root_R46.crt"
    cp "$T/r46.pem" "$f" 2>/dev/null && chown "$(stat -c %U "$h")": "$f" 2>/dev/null; chmod 644 "$f" 2>/dev/null
    [ -f "$f" ] && say "файл корня положен сюда: $f"
  done
  say "РУЧНОЙ ИМПОРТ: Яндекс Браузер - Настройки - Безопасность - Управление сертификатами - Центры сертификации - Импорт - GlobalSign_Root_R46.crt - Доверять для сайтов."
  say "Либо поставьте libnss3-tools (с диска Astra) и запустите команду ещё раз."
fi

# 4. проверка
r=$(echo | timeout 15 openssl s_client -connect $SITE_IP:443 -servername $SITE 2>&1 | grep "Verify return code")
say "проверка $SITE: ${r:-нет ответа}"
say "ГОТОВО. Полностью закройте и откройте Яндекс Браузер."
