fix and update
This commit is contained in:
75
install.sh
75
install.sh
@@ -1603,6 +1603,45 @@ registrable_domain() {
|
||||
fi
|
||||
}
|
||||
|
||||
collect_oauth_redirect_sans_hosts() {
|
||||
local f="${LOCAL_CERTS_DIR}/oauth-redirect-sans.txt"
|
||||
[[ -f "$f" ]] || return 0
|
||||
local host
|
||||
while IFS= read -r host || [[ -n "$host" ]]; do
|
||||
host="${host#"${host%%[![:space:]]*}"}"
|
||||
host="${host%"${host##*[![:space:]]}"}"
|
||||
[[ -z "$host" || "$host" == \#* ]] && continue
|
||||
echo "$host"
|
||||
done < "$f"
|
||||
}
|
||||
|
||||
# Нормализованный список SAN для сравнения сертификата с желаемым набором.
|
||||
self_signed_sans_fingerprint() {
|
||||
collect_self_signed_sans | tr ',' '\n' | sed 's/^DNS://' | sort -u | paste -sd, -
|
||||
}
|
||||
|
||||
current_self_signed_sans_fingerprint() {
|
||||
local cert="${LOCAL_CERTS_DIR}/shared-intranet/fullchain.pem"
|
||||
[[ -f "$cert" ]] || return 1
|
||||
openssl x509 -in "$cert" -noout -ext subjectAltName 2>/dev/null \
|
||||
| sed 's/ *subjectAltName=//;s/DNS://g' \
|
||||
| tr ',' '\n' | sed 's/^ *//' | sort -u | paste -sd, -
|
||||
}
|
||||
|
||||
renew_self_signed_cert_if_sans_changed() {
|
||||
[[ "$(env_get SSL_TYPE none)" != "selfsigned" ]] && return 0
|
||||
local desired current
|
||||
desired="$(self_signed_sans_fingerprint)"
|
||||
current="$(current_self_signed_sans_fingerprint 2>/dev/null || true)"
|
||||
if [[ -z "$current" || "$desired" != "$current" ]]; then
|
||||
if [[ -n "$current" ]]; then
|
||||
log "SAN сертификата изменились (OAuth redirect URI) — пересоздаём self-signed"
|
||||
fi
|
||||
generate_all_self_signed_certs --force
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
collect_self_signed_sans() {
|
||||
local -a sans=()
|
||||
local base domain
|
||||
@@ -1626,7 +1665,14 @@ collect_self_signed_sans() {
|
||||
sans+=("DNS:${apex}")
|
||||
fi
|
||||
|
||||
# Дополнительные SAN для сторонних приложений в LAN (через запятую в .env).
|
||||
# Авто: домены из redirect_uri OAuth-приложений (nginx/certs/oauth-redirect-sans.txt).
|
||||
local oauth_host
|
||||
while IFS= read -r oauth_host; do
|
||||
[[ -z "$oauth_host" ]] && continue
|
||||
sans+=("DNS:${oauth_host}")
|
||||
done < <(collect_oauth_redirect_sans_hosts)
|
||||
|
||||
# Ручной override (дополнительно к OAuth), через запятую в .env.
|
||||
local extra_sans="${EXTRA_SSL_SANS:-}"
|
||||
if [[ -n "$extra_sans" ]]; then
|
||||
local entry
|
||||
@@ -1639,7 +1685,17 @@ collect_self_signed_sans() {
|
||||
done
|
||||
fi
|
||||
|
||||
(IFS=,; echo "${sans[*]}")
|
||||
# Уникальные SAN
|
||||
local -A _seen=()
|
||||
local -a unique=()
|
||||
local item key
|
||||
for item in "${sans[@]}"; do
|
||||
key="${item#DNS:}"
|
||||
[[ -n "${_seen[$key]:-}" ]] && continue
|
||||
_seen[$key]=1
|
||||
unique+=("$item")
|
||||
done
|
||||
(IFS=,; echo "${unique[*]}")
|
||||
}
|
||||
|
||||
find_custom_cert_file() {
|
||||
@@ -1820,6 +1876,7 @@ install_custom_certificates() {
|
||||
}
|
||||
|
||||
generate_shared_self_signed_cert() {
|
||||
local force="${1:-}"
|
||||
local cert_dir="${LOCAL_CERTS_DIR}/shared-intranet"
|
||||
local base sans cn
|
||||
|
||||
@@ -1829,7 +1886,7 @@ generate_shared_self_signed_cert() {
|
||||
cn="*.${base}"
|
||||
sans="$(collect_self_signed_sans)"
|
||||
|
||||
if [[ -f "${cert_dir}/fullchain.pem" && -f "${cert_dir}/privkey.pem" ]]; then
|
||||
if [[ -f "${cert_dir}/fullchain.pem" && -f "${cert_dir}/privkey.pem" && "$force" != "--force" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
@@ -1856,7 +1913,7 @@ generate_all_self_signed_certs() {
|
||||
if [[ "$force" == "--force" ]]; then
|
||||
rm -f "${LOCAL_CERTS_DIR}/shared-intranet/fullchain.pem" "${LOCAL_CERTS_DIR}/shared-intranet/privkey.pem"
|
||||
fi
|
||||
generate_shared_self_signed_cert
|
||||
generate_shared_self_signed_cert "$force"
|
||||
ok "Самоподписанный сертификат создан: ${LOCAL_CERTS_DIR}/shared-intranet"
|
||||
}
|
||||
|
||||
@@ -2775,13 +2832,13 @@ print_intranet_hint() {
|
||||
if [[ "$(env_get SSL_TYPE none)" == "selfsigned" ]]; then
|
||||
echo " Сертификат: ${LOCAL_CERTS_DIR}/shared-intranet (общий для всех доменов IdP)"
|
||||
echo " FedCM/One Tap: браузер открывает ${apex_domain:-корневой домен}/.well-known/web-identity —"
|
||||
echo " примите сертификат для ${DOMAIN_FRONTEND}, ${DOMAIN_API}${extra_apex} и сайта вашего приложения."
|
||||
echo " примите сертификат для ${DOMAIN_FRONTEND}, ${DOMAIN_API}${extra_apex} и доменов OAuth-приложений."
|
||||
echo " SAN OAuth-приложений подтягиваются автоматически из redirect_uri (файл oauth-redirect-sans.txt)."
|
||||
echo " Надёжно: импортируйте fullchain.pem в «Доверенные корневые центры» на каждом ПК (Windows/macOS)."
|
||||
if [[ -n "$(env_get EXTRA_SSL_SANS "")" ]]; then
|
||||
echo " EXTRA_SSL_SANS: $(env_get EXTRA_SSL_SANS "")"
|
||||
else
|
||||
echo " Для другого домена приложения добавьте в .env: EXTRA_SSL_SANS=myapp.lan и ./install.sh --fix-all"
|
||||
echo " EXTRA_SSL_SANS (ручной доп.): $(env_get EXTRA_SSL_SANS "")"
|
||||
fi
|
||||
echo " После нового OAuth-клиента: ./install.sh --fix-all (или обновление SSL) пересоздаст сертификат."
|
||||
echo ""
|
||||
fi
|
||||
if [[ "$(env_get LDAP_USE_HOST_NETWORK false)" == "true" ]]; then
|
||||
@@ -3340,7 +3397,7 @@ action_fix_all_errors() {
|
||||
case "$ssl_type" in
|
||||
none) write_nginx_http_only || warn "Не удалось записать HTTP-конфиги Nginx" ;;
|
||||
selfsigned)
|
||||
generate_all_self_signed_certs
|
||||
renew_self_signed_cert_if_sans_changed
|
||||
write_all_nginx_configs "selfsigned" || warn "Не удалось обновить конфиги Nginx"
|
||||
;;
|
||||
custom)
|
||||
|
||||
Reference in New Issue
Block a user