Les instructions suivantes décrivent le processus de reconstruction à l’identique depuis les « sources » dans un environnement de compilation sécurisé, d’un build reproductible pour une version donnée d’Eclipse Temurin sur la plateforme Linux x64. Le processus est réalisé de manière sécurisée, en n’utilisant que les sources d’origine et des outils de compilation vérifiés de façon sécurisée, afin de fournir un mécanisme permettant de vérifier de manière sécurisée le binaire de la version Eclipse Temurin. Cette vérification contribue à déterminer la sécurité des chaînes d’approvisionnement utilisées pour compiler les binaires officiels d’Eclipse Temurin.
La procédure comprend les étapes suivantes :
-
Configuration de l’environnement de compilation
-
Compilation du gcc DevKit depuis les « sources », identique à celui utilisé par Eclipse Adoptium
-
Détermination des arguments de configuration make d’OpenJDK correspondant aux options d’Eclipse Temurin
-
Compilation du JDK Eclipse Temurin en local
-
Comparaison de la recompilation locale sécurisée d’Eclipse Temurin avec le binaire officiel d’Eclipse Temurin
Procédure de build de vérification reproductible sur Linux x64
-
Environnement de compilation
Pour recompiler Eclipse Temurin à l’identique sur Linux x64, un système Centos ou RHEL adapté, de version 7 ou 8, est requis.
-
Installer les outils EPEL
Centos7/8 :
yum install epel-releaseRHEL7 :
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmRHEL8 :
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -
Installer les outils de compilation
yum install -y tar git patch gcc gcc-c++ wget bison texinfo lbzip2 zip unzip glibc.x86_64 glibc-devel.x86_64 glibc.i686 glibc-devel.i686 libgcc.i686 yum install -y autoconf systemtap systemtap-sdt-devel -
Version de GNU make >= 4 ?
GNU make doit être au moins en version 4 pour pouvoir compiler le gcc DevKit.
Vérifiez la version de GNU make
make --versionSi la version est inférieure à 4, téléchargez et compilez GNU make 4.3 comme suit :
curl -O -L https://ftp.gnu.org/gnu/make/make-4.3.tar.gz curl -O -L https://ftp.gnu.org/gnu/make/make-4.3.tar.gz.sig # Verify download: gpg --keyserver keyserver.ubuntu.com --recv-keys 6D4EEB02AD834703510B117680CB727A20C79BB2 # Reference: https://lists.gnu.org/archive/html/bug-make/2016-12/msg00002.html gpg --verify make-4.3.tar.gz.sig make-4.3.tar.gz # Check for "Good signature" # Build tar -xf make-4.3.tar.gz (cd make-4.3 && ./configure --prefix=/usr/local && make clean && make && make install) ln -s /usr/local/bin/make /usr/local/bin/gmake -
Définir le fuseau horaire sur UTC
Pour obtenir des builds identiques, le fuseau horaire de compilation doit être UTC afin de garantir une sortie binaire exacte
timedatectl set-timezone UTC -
Télécharger les fichiers de script make du DevKit Toolchain d’Adoptium
Afin de compiler de façon sécurisée et identique un gcc DevKit Toolchain, téléchargez de manière sécurisée les scripts suivants depuis le dépôt Eclipse Adoptium. Ces scripts et correctifs permettent au processus de make du DevKit de compiler avec un sysroot Centos et activent également le téléchargement vérifié par GPG des RPM Centos pour une vérification d’intégrité supplémentaire.
curl -L -O https://raw.githubusercontent.com/adoptium/ci-jenkins-pipelines/master/pipelines/build/devkit/make_devkit.sh curl -L -O https://raw.githubusercontent.com/adoptium/ci-jenkins-pipelines/master/pipelines/build/devkit/Tools.gmk.patch curl -L -O https://raw.githubusercontent.com/adoptium/ci-jenkins-pipelines/master/pipelines/build/devkit/binutils-2.39.patch -
Compiler le gcc DevKit Toolchain depuis les sources
bash ./make_devkit.sh jdk21u x86_64 Centos 7.9.2009Le « chemin du DevKit » compilé sera dans le dossier jdk21u/build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu
Définissez LD_LIBRARY_PATH pour localiser les bibliothèques du DevKit nouvellement compilé
export LD_LIBRARY_PATH=<DevKit path>/lib64:<DevKit path>/lib -
Télécharger le SBOM du build Eclipse Temurin à vérifier
Par exemple, pour télécharger le SBOM et les métadonnées du SBOM pour la version jdk-21.0.4+7
curl -L -O https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4%2B7/OpenJDK21U-sbom_x64_linux_hotspot_21.0.4_7.json curl -L -O https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4%2B7/OpenJDK21U-sbom_x64_linux_hotspot_21.0.4_7-metadata.json -
Déterminer l’étiquette source OpenJDK à compiler
Ouvrez le fichier SBOM json et déterminez la « SCM Ref » à partir de laquelle la version a été compilée
{ "name" : "SCM Ref", "value" : "jdk-21.0.4+7_adopt" },L’étiquette OpenJDK est cette valeur sans le suffixe « _adopt », par exemple « jdk-21.0.4+7 »
-
Télécharger un Boot JDK approprié
Pour compiler Temurin, vous avez besoin d’un Boot JDK approprié. Ouvrez le fichier SBOM json et déterminez la version utilisée pour compiler la version
{ "name" : "BOOTJDK", "version" : "20.0.2+9" },Téléchargez et vérifiez de façon sécurisée la version requise depuis https://github.com/adoptium/temurin<NN>-binaries/releases
# Download JDK tar.gz curl -L -O https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gz # Download GPG sig file to verify curl -L -O https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gz.sig # Verify JDK using Adoptium GPG key gpg --keyserver keyserver.ubuntu.com --recv-keys 3B04D753C9050D9A5D343F39843C48A565F8F04B echo -e "5\ny\n" | gpg --batch --command-fd 0 --expert --edit-key 3B04D753C9050D9A5D343F39843C48A565F8F04B trust; gpg --verify OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gz.sig OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gzAssurez-vous d’obtenir « Good signature from Adoptium GPG Key (DEB/RPM Signing Key) »
Décompressez dans un dossier approprié
tar -xf OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gzAjoutez au PATH de l’environnement
export PATH=<bootjdk>/bin:$PATH -
Cloner les sources OpenJDK requises
Remplacez jdk21u par la version à compiler
git clone https://github.com/openjdk/jdk21u.git jdk21u_bld # Checkout required tag to build (cd jdk21u_bld && git checkout <OpenJDK tag to build>) -
Créer un répertoire de compilation local
mkdir openjdk_build -
Configurer la compilation
Déterminez et modifiez les « configure args » pour qu’ils correspondent à votre environnement local
-
Déterminer les arguments de configuration pour ce build
Utilisez le grep suivant pour trouver les arguments de configuration requis dans le SBOM-metadata.json
grep "using configure arguments" <SBOM-metadata.json> | sed -n -e "s/^.*using configure arguments '\(.*\)'\..*/\1/p" -
Remplacez -–with-devkit=<path> par le chemin vers le gcc DevKit compilé localement « <path>/jdk21u/build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu ».
-
Supprimez -–with-cacerts-src=<path>, car Temurin est compilé avec les certificats CA Mozilla, tandis que la compilation locale utilisera les certificats CA OpenJDK standard.
-
Remplacez -–with-boot-jdk=<path> par le chemin vers votre boot JDK décompressé localement.
Configurez depuis le répertoire « openjdk_build »
cd openjdk_build bash ../jdk21u_bld/configure <edited configure args>
-
-
Compiler Temurin
make images -
Supprimer les fichiers de sortie du build non pertinents pour la comparaison du build reproductible
-
« cacerts » : Temurin est compilé avec sa propre liste de certificats CA Mozilla (à supprimer de lib/security et java.base/lib/security)
-
« release » : le fichier de description textuelle « release » diffère en raison de l’environnement du système d’exploitation de compilation et des métadonnées supplémentaires de Temurin
-
« demo » : Temurin ne livre pas les fichiers d’exemples « demo »
-
« debuginfo » : l’archive tar du JDK Temurin ne contient pas de debuginfo
rm -f images/jdk/lib/security/cacerts rm -f images/jdk/release rm -rf images/jdk/demo find "images/jdk" -type f -name "*.debuginfo" -delete (mkdir images/jdk/jmods/java.base_expanded && jmod extract --dir images/jdk/jmods/java.base_expanded images/jdk/jmods/java.base.jmod && rm -f images/jdk/jmods/java.base.jmod) rm -f images/jdk/jmods/java.base_expanded/lib/security/cacerts # Change back to root directory cd ..
-
-
Télécharger la version officielle d’Eclipse Temurin pour la « Vérification »
Téléchargez et décompressez le JDK Temurin à vérifier :
curl -L -o temurin-linux-x64-jdk-21.0.4+7.tar.gz https://api.adoptium.net/v3/binary/version/jdk-21.0.4+7/linux/x64/jdk/hotspot/normal/adoptium tar -xf temurin-linux-x64-jdk-21.0.4+7.tar.gz -
Supprimer les mêmes fichiers non pertinents
rm -f jdk-21.0.4+7/lib/security/cacerts rm -f jdk-21.0.4+7/release rm -f jdk-21.0.4+7/NOTICE (mkdir jdk-21.0.4+7/jmods/java.base_expanded && jmod extract --dir jdk-21.0.4+7/jmods/java.base_expanded jdk-21.0.4+7/jmods/java.base.jmod && rm -f jdk-21.0.4+7/jmods/java.base.jmod) rm -f jdk-21.0.4+7/jmods/java.base_expanded/lib/security/cacerts -
Vérifier que la recompilation locale sécurisée est identique au binaire officiel d’Eclipse Temurin
Comparez les deux images
diff -r openjdk_build/images/jdk jdk-21.0.4+7Pour une vérification réussie, il ne doit y avoir aucune différence.

