HEX
Server: Apache/2.4.63 (Unix)
System: Linux TOMS-220NAS 4.4.302+ #86009 SMP Wed Nov 26 18:19:17 CST 2025 x86_64
User: flavio87 (1026)
PHP: 8.3.27
Disabled: NONE
Upload Files
File: //usr/syno/bin/update-ca-certificates.sh
CERTSDIR=/usr/share/ca-certificates
USERCERTSDIR=/usr/syno/etc/security-profile/ca-bundle-profile/ca-certificates
AUTOUPDATECERTSDIR=/var/db/ca-certificates
AUTOUPDATECERTSBACKUPDIR=/var/db/backups/ca-certificates
CERTBUNDLE=ca-certificates.crt
ETCCERTSDIR=/etc/ssl/certs

cleanup() {
  rm -f "$TEMPBUNDLE"
  rm -f "$ADDED"
  rm -f "$REMOVED"
}
trap cleanup 0

TEMPBUNDLE="${ETCCERTSDIR}/${CERTBUNDLE}.new"
ADDED="$(mktemp -p "${TMPDIR:-/tmp}" "ca-certificates.tmp.XXXXXX")"
REMOVED="$(mktemp -p "${TMPDIR:-/tmp}" "ca-certificates.tmp.XXXXXX")"

add() {
  CERT="$1"
  PEM="$ETCCERTSDIR/$(basename "$CERT" .crt | sed -e 's/ /_/g' \
                                                  -e 's/[()]/=/g' \
                                                  -e 's/,/_/g').pem"
  if ! test -e "$PEM" || [ "$(readlink "$PEM")" != "$CERT" ]
  then
    ln -sf "$CERT" "$PEM"
    echo "+$PEM" >> "$ADDED"
  fi
  # Add trailing newline to certificate, if it is missing (#635570)
  sed -e '$a\' "$CERT" >> "$TEMPBUNDLE"
}

remove() {
  CERT="$1"
  PEM="$ETCCERTSDIR/$(basename "$CERT" .crt).pem"
  if test -L "$PEM"
  then
    rm -f "$PEM"
    echo "-$PEM" >> "$REMOVED"
  fi
}

cd "$ETCCERTSDIR"

# NOTE: remove all symbolic link first
find . -type l -print | while read -r symlink
do
  rm -f "$symlink"
done

# NOTE: create user uploaded certificate
if [ -d "$USERCERTSDIR" ]
then
  find -L "$USERCERTSDIR" -type f -name '*.crt' | sort | while read -r crt
  do
    add "$crt"
  done
fi

# NOTE: if autoupdate certificate dir exist, and has *.crt use AUTOUPDATECERTSDIR
#       otherwiese, use DSM default version
/bin/ls "$AUTOUPDATECERTSDIR"/*.crt 2> /dev/null 1> /dev/null
if [ $? -eq 0 ]
then
  valid=true
  # check certificates in AUTOUPDATECERTSDIR are valid
  for crt in "$AUTOUPDATECERTSDIR"/*.crt; do
    if ! openssl x509 -in "$crt" -noout > /dev/null 2>&1; then
      echo "Invalid certificate found: $crt"
      # Restore from backup if invalid certificate found
      if [ -d "$AUTOUPDATECERTSBACKUPDIR" ]; then
        echo "Trying to restore from backup..."
        cp -a "$AUTOUPDATECERTSBACKUPDIR"/. "$AUTOUPDATECERTSDIR"
        rm -rf "$AUTOUPDATECERTSBACKUPDIR"
        echo "Restored from backup."
      else
        echo "Backup directory not found. Skipping restoration and autoupdate."
        valid=false
      fi
    fi
  done
  if [ "$valid" = true ]; then
    CERTSDIR=$AUTOUPDATECERTSDIR
    rm -rf "$AUTOUPDATECERTSBACKUPDIR"
  else
    echo "Using default certificate directory due to invalid autoupdate ca-certificates."
  fi
fi

# NOTE: create DSM system certificate symbolic link
#       if filename duplicate, use system certificate instead of user uploaded
find -L "$CERTSDIR" -type f -name '*.crt' | sort | while read -r crt
do
  add "$crt"
done

openssl rehash . > /dev/null

chmod 0644 "$TEMPBUNDLE"
mv -f "$TEMPBUNDLE" "$CERTBUNDLE"

ADDED_CNT=$(wc -l < "$ADDED")
REMOVED_CNT=$(wc -l < "$REMOVED")
echo "$ADDED_CNT added, $REMOVED_CNT removed; done."