Vérifier des téléchargements avec cURL et b2sum
Téléchargez dans un fichier temporaire, comparez sa somme de contrôle BLAKE2b à la valeur fournie par
un éditeur de confiance et ne créez la destination que si les octets concordent. Le script Bash
ci-dessous combine cURL et b2sum sans remplacer de fichier existant, puis
illustre le flux de travail avec la somme de contrôle réelle d’une version publiée.
Obtenir la somme de contrôle attendue auprès de l’éditeur
L’exécution de b2sum sur un téléchargement vous indique sa somme de contrôle
actuelle. Elle ne vous indique pas ce que cette somme devrait être. Obtenez la valeur attendue pour
la version, l’architecture et le nom de fichier exacts auprès d’un éditeur auquel vous faites
confiance, par exemple sa page officielle de publication en HTTPS ou un manifeste de sommes de
contrôle dont la signature a été vérifiée. Une somme de contrôle copiée depuis le même miroir non
fiable que le téléchargement n’apporte aucune référence digne de confiance.
GNU b2sum utilise par défaut
BLAKE2b-512 : 64 octets de condensat écrits sous forme de 128 caractères hexadécimaux. Ce script
exige ce format. BLAKE2s, un condensat BLAKE2b plus court et SHA-256 ne sont pas interchangeables
avec lui. Si l’éditeur ne fournit que SHA-256, utilisez un flux de travail de vérification SHA-256
au lieu d’inventer une référence BLAKE2b en calculant vous-même l’empreinte du fichier téléchargé.
Vérifier les prérequis Linux
Utilisez une machine Linux sur laquelle GNU Bash, cURL avec prise en charge de HTTPS et GNU
Coreutils sont déjà installés. Coreutils fournit b2sum, mktemp, ln et rm. Cet exemple a été testé
avec Bash 5.3.15, cURL 8.22.0 et Coreutils 9.11 ; il ne s’agit pas d’une recette pour macOS ou
PowerShell. Vérifiez vos outils :
bash --version && curl --version && b2sum --version
Exécutez le script dans un répertoire que vous contrôlez, sur un système de fichiers qui prend en
charge les liens physiques. La destination est un nom de fichier dans ce répertoire, et non un
chemin vers un autre répertoire. Les espaces et les traits d’union en tête sont autorisés ; les
barres obliques, les sauts de ligne, . et .. sont refusés. Le fichier est enregistré avec des droits
de lecture et d’écriture réservés au propriétaire, et un fichier, un répertoire ou un lien
symbolique existant est laissé intact.
Enregistrer le script de vérification complet
Enregistrez ce code dans un nouveau fichier nommé verify-download.sh. Exécutez-le avec bash ; ne collez pas le
script dans votre shell interactif, car ses sorties en erreur sont conçues pour mettre fin au
programme enregistré.
#!/usr/bin/env bash
set -euo pipefail
export LC_ALL=C
umask 077
if (( $# != 3 )); then
printf 'Usage: bash verify-download.sh HTTPS_URL BLAKE2B_512_HEX FILENAME\n' >&2
exit 2
fi
url=$1
expected=${2,,}
filename=$3
if [[ ! $expected =~ ^[0-9a-f]{128}$ ]]; then
printf 'Expected checksum must contain exactly 128 hexadecimal characters.\n' >&2
exit 2
fi
if [[ $url != https://* ]]; then
printf 'The download URL must use HTTPS.\n' >&2
exit 2
fi
if [[ -z $filename || $filename == */* || $filename == . || $filename == .. ||
$filename == *$'\n'* || $filename == *$'\r'* ]]; then
printf 'Use a filename without slashes or line breaks.\n' >&2
exit 2
fi
destination="./$filename"
if [[ -e $destination || -L $destination ]]; then
printf 'Destination already exists: %s\n' "$destination" >&2
exit 1
fi
temporary=$(mktemp -d ./.b2-download.XXXXXXXX)
trap 'rm -rf -- "$temporary"' EXIT
if ! curl -q -fsSL --globoff --proto '=https' --proto-redir '=https' \
--max-redirs 5 --connect-timeout 10 --max-time 300 \
--output "$temporary/payload" --url "$url"; then
printf 'Download failed; no file saved.\n' >&2
exit 1
fi
if ! printf '%s %s\n' "$expected" "$temporary/payload" |
b2sum --check --strict --status -; then
printf 'Checksum mismatch or unreadable download; no file saved.\n' >&2
exit 1
fi
if ! ln -T -- "$temporary/payload" "$destination"; then
printf 'Destination exists or cannot be created; no file saved.\n' >&2
exit 1
fi
printf 'Verified and saved: %s\n' "$destination"
L’enregistrement de liste de sommes de contrôle fourni en entrée à la vérification utilise le format
de GNU : le condensat, deux espaces, puis le nom de fichier. Le script construit cet enregistrement
pour sa propre charge utile temporaire au lieu de laisser un manifeste téléchargé choisir des chemins
locaux. --strict rejette les enregistrements de somme de contrôle mal formés,
tandis que la vérification des arguments impose la longueur de condensat de 512 bits avant tout
transfert.
La dernière étape utilise un lien physique,
et non mv : GNU ln -T sans --force échoue si la destination existe, y compris si elle
apparaît après la vérification initiale. Conserver le fichier temporaire dans le répertoire de
destination évite un lien entre systèmes de fichiers différents. Le piège de sortie supprime le
répertoire temporaire privé en cas de réussite normale comme d’échec. Une interruption brutale ou
une coupure de courant peut le laisser en place ; il ne s’agit pas d’un système de reprise après
plantage.
Télécharger une version accompagnée d’une somme de contrôle BLAKE2b publiée
La page de téléchargement d’Arch Linux renvoie vers son manifeste BLAKE2b. Pour un exemple reproductible, utilisez l’archive tar d’amorçage du 1er septembre 2026, et non une URL « latest » dont la cible change. Il s’agit du téléchargement d’une archive d’environ 121 MiB, et non d’une instruction pour installer, extraire ou exécuter cette version.
Lisez le manifeste versionné de l’éditeur via HTTPS :
curl -q -fsSL --proto '=https' --proto-redir '=https' --max-time 30 \
--url 'https://archive.archlinux.org/iso/2026.09.01/b2sums.txt'
Repérez la ligne qui se termine par archlinux-bootstrap-2026.09.01-x86_64.tar.zst. Copiez son premier champ, et non
la somme de contrôle de l’ISO ni une somme de contrôle que vous avez générée localement. L’invocation
ci-dessous utilise cette valeur publiée de 128 caractères et enregistre l’archive tar
correspondante :
(
url='https://archive.archlinux.org/iso/2026.09.01/archlinux-bootstrap-2026.09.01-x86_64.tar.zst'
expected='3893c310ec7d52fd5dee7eec51bc9d611200a5636985c8b627871d1ee85d83821284bcb9a6843afa011a6607ee9ce3202f7e7f5f168f29a07541c0836eeaefd0'
bash verify-download.sh "$url" "$expected" archlinux-bootstrap-2026.09.01-x86_64.tar.zst
)
En cas de réussite, le programme enregistré affiche :
Verified and saved: ./archlinux-bootstrap-2026.09.01-x86_64.tar.zst
Ce n’est qu’à ce moment-là que la destination est créée. Un fichier vide est également valide si sa somme de contrôle attendue concorde ; le script vérifie des octets, et non leur capacité à former une archive utile.
Interpréter les échecs avant d’utiliser le fichier
- Somme de contrôle non concordante : aucune destination n’est créée et le téléchargement temporaire est supprimé. Revérifiez la version, l’architecture et la valeur attendue de confiance. Ne « corrigez » pas la non-concordance en utilisant la propre somme de contrôle du téléchargement comme valeur attendue.
- Erreur HTTP, TLS ou de transfert incomplet : cURL échoue, le script renvoie un code non nul et toute charge utile partielle est supprimée. Le transfert dispose d’un délai de cinq minutes ; ajustez-le délibérément pour des téléchargements plus volumineux ou des connexions plus lentes.
- Destination existante : le script renvoie un code non nul et préserve ses octets. Choisissez un autre nom de fichier plutôt que de supprimer un téléchargement antérieur sans le vérifier.
- Échec de publication : une opération de lien physique non prise en charge ou une destination créée pendant le transfert empêche la réussite. La vérification seule ne signifie pas que le fichier a été enregistré.
Les options de cURL rendent visibles les échecs de transfert : -f traite
la plupart des réponses d’erreur HTTP comme des échecs, -sS masque l’indicateur de progression mais conserve les diagnostics, et -L
suit les redirections. L’URL de départ comme les redirections sont limitées à HTTPS, avec cinq
redirections au maximum. -q est placé en premier afin qu’une configuration curl locale ne puisse pas modifier silencieusement les options de cette commande.
Les redirections limitées à HTTPS peuvent tout de même changer d’hôte ; la somme de contrôle de
confiance reste la référence au niveau des octets.
Comprendre ce que prouve une somme de contrôle concordante
Une concordance établit l’accord avec le condensat attendu, et non que le fichier est inoffensif ou qu’une personne précise l’a publié. Dans cet exemple, la base de confiance est le site HTTPS de l’éditeur Arch Linux. Si un attaquant contrôle à la fois l’artefact et cette source de somme de contrôle, il peut remplacer les deux. Pour authentifier l’éditeur au-delà de cette base de confiance, suivez les instructions de vérification de signature de l’éditeur et établissez séparément l’identité de la clé de signature.
Le script suppose également que d’autres processus ne peuvent pas modifier de manière malveillante votre répertoire de travail ou le fichier enregistré. Il s’agit d’une vérification locale du téléchargement, et non d’un bac à sable ni d’une garantie que les octets restent inchangés après la vérification. Dans un flux de travail de catalogage de médias, conservez la somme de contrôle attendue avec sa source et les informations de version afin qu’une comparaison ultérieure dispose d’une référence que vous pouvez expliquer.
