Build de vérification reproductible de Temurin sur Linux x64

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

  1. 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.

  2. Installer les outils EPEL

    Centos7/8 :

    yum install epel-release

    RHEL7 :

    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

    RHEL8 :

    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
  3. 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
  4. 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 --version

    Si 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
  5. 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
  6. 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
  7. Compiler le gcc DevKit Toolchain depuis les sources

    bash ./make_devkit.sh jdk21u x86_64 Centos 7.9.2009

    Le « 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
  8. 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
  9. 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 »

  10. 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.gz

    Assurez-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.gz

    Ajoutez au PATH de l’environnement

    export PATH=<bootjdk>/bin:$PATH
  11. 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>)
  12. Créer un répertoire de compilation local

    mkdir openjdk_build
  13. Configurer la compilation

    Déterminez et modifiez les « configure args » pour qu’ils correspondent à votre environnement local

    1. 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"
    2. 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 ».

    3. 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.

    4. 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>
  14. Compiler Temurin

    make images
  15. Supprimer les fichiers de sortie du build non pertinents pour la comparaison du build reproductible

    1. « cacerts » : Temurin est compilé avec sa propre liste de certificats CA Mozilla (à supprimer de lib/security et java.base/lib/security)

    2. « 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

    3. « demo » : Temurin ne livre pas les fichiers d’exemples « demo »

    4. « 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 ..
  16. 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
  17. 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
  18. 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+7

    Pour une vérification réussie, il ne doit y avoir aucune différence.

edit icon

Aidez-nous à améliorer cette documentation !

Toutes les documentations Adoptium sont open source. Une erreur ou un point flou ?

Auteurs de la documentation
andrew-m-leonardgdams
Join our Slack channel to discuss and reach out to maintainers.Join Slack