Build de vérification reproductible de Temurin sur Windows 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 Windows x64. Le processus est réalisé de manière sécurisée, en n’utilisant que les sources d’origine et les outils de compilation officiels de Microsoft Visual Studio, 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

  • Installation de la version requise de Microsoft Visual Studio Build Tools pour le compilateur C/C++

  • 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, à l’aide du script de comparaison de builds reproductibles de temurin-build d’Adoptium, qui ajuste la comparaison par rapport aux exécutables natifs « signés »

Procédure de build de vérification reproductible sur Windows x64

  1. Environnement de compilation

    Pour recompiler Eclipse Temurin à l’identique sur Windows x64, un environnement de compilation Windows adapté avec exactement les mêmes Microsoft Visual Studio Build Tools requis est nécessaire, et il faut supprimer toute version précédente potentiellement conflictuelle.

    Assurez-vous de désinstaller tous les composants Microsoft Visual Studio précédents via Paramètres Windows → « Ajouter ou supprimer des programmes », notamment :

    • Visual Studio <Édition> 20xx …​

    • Microsoft C++ <année..année> Redistributables

    • Microsoft Visual Studio Installer

    • Windows Software Development Kit

    • Windows SDK Addon

  2. Vérifiez que le fuseau horaire du système Windows est UTC pour garantir un build identique

    Définissez le « Fuseau horaire » Windows sur UTC en vérifiant la valeur dans Paramètres Windows → « Heure et langue » → « Date et heure » → « Fuseau horaire ».

  3. Redémarrez le système Windows après avoir désinstallé des programmes ou modifié le fuseau horaire.

  4. Installer la version requise de Microsoft Visual Studio

    Installez Microsoft Visual Studio VS2022 édition « Build Tools » version 17.7.3 qui contient la version 19.37.32822 du compilateur C/C++ :

  5. Installer les dépendances de compilation requises :

    Installez Cygwin avec les dépendances nécessaires pour compiler OpenJDK :

    curl -L -O https://cygwin.com/setup-x86_64.exe
    curl -l -O https://cygwin.com/setup-x86_64.exe.sig
    # Verify download: Import "Cygwin <[email protected]>" GPG key
    gpg --keyserver keyserver.ubuntu.com --recv-keys 1A698DE9E2E56300
    gpg --verify setup-x86_64.exe.sig setup-x86_64.exe
    # Check for "Good signature"

    En supposant que setup-x86_64.exe est sécurisé et que la vérification GPG signale « Good signature », installez Cygwin :

    setup-x86_64.exe --packages autoconf,automake,bsdtar,cmake,cpio,curl,gcc-core,git,gnupg,grep,jq,libtool,make,mingw64-x86_64-gcc-core,perl,rsync,unzip,wget,zip --download --local-install --delete-orphans --site https://mirrors.kernel.org/sourceware/cygwin/ --local-package-dir C:\cygwin_packages --root C:\cygwin64
  6. Ouvrez une fenêtre de terminal Cygwin pour effectuer la compilation depuis celle-ci

    Double-cliquez sur l’icône du bureau « Cygwin Terminal » pour ouvrir un nouveau terminal Cygwin exécutant le shell bash

  7. Déterminer la configuration de compilation requise pour reproduire la version cible d’Eclipse Temurin

    Pour la version requise d’Eclipse Temurin, téléchargez le SBOM et les métadonnées du SBOM depuis le dépôt officiel de binaires Adoptium, par exemple pour jdk-21.0.4+7 :

    curl -L -O https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4%2B7/OpenJDK21U-sbom_x64_windows_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_windows_hotspot_21.0.4_7-metadata.json
  8. 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 »

  9. 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 zip
    curl -L -O https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_x64_windows_hotspot_20.0.2_9.zip
    # 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_windows_hotspot_20.0.2_9.zip.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_windows_hotspot_20.0.2_9.zip.sig OpenJDK20U-jdk_x64_windows_hotspot_20.0.2_9.zip

    Assurez-vous d’obtenir « Good signature from Adoptium GPG Key (DEB/RPM Signing Key) »

    Décompressez dans un dossier approprié

    unzip OpenJDK20U-jdk_x64_windows_hotspot_20.0.2_9.zip

    Ajoutez au PATH de l’environnement afin que les outils java et javac soient disponibles pour les scripts utilisés ultérieurement dans ces instructions.

    export PATH=<bootjdk>/bin:$PATH
  10. Cloner les sources OpenJDK requises

    Remplacez jdk21u par la version à compiler

    git clone https://github.com/openjdk/jdk21u.git
    # Checkout required tag to build
    (cd jdk21u && git checkout <OpenJDK tag to build>)
  11. Créer un répertoire de compilation local spécifique

    Remarque : Ceci est nécessaire UNIQUEMENT pour jdk-21.0.4+7 en raison d’un problème de build reproductible (https://github.com/adoptium/temurin-build/issues/3790). Pour les versions ultérieures, cela n’est pas nécessaire.

    Créez le répertoire de compilation local exact suivant pour le build. Le chemin doit correspondre exactement pour que le build soit identiquement reproductible.

    mkdir -p C:/workspace/openjdk-build/workspace/build/openjdkbuild
  12. 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. 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.

    3. Mettez à jour --with-ucrt-dll-dir=<path> pour vous assurer qu’il correspond à l’emplacement sur votre machine locale, spécifiez :

      --with-ucrt-dll-dir='C:/Program Files (x86)/Windows Kits/10/Redist/10.0.22621.0/ucrt/DLLs/x64'
    4. Remplacez -–with-boot-jdk=<path> par le chemin vers votre boot JDK décompressé localement.

      Configurez depuis le répertoire « C:/workspace/openjdk-build/workspace/build/openjdkbuild »

      cd C:/workspace/openjdk-build/workspace/build/openjdkbuild
      bash ~/jdk21u/configure <edited configure args>
  13. Compiler Temurin

    make images

    L’image compilée sera disponible dans le répertoire : /cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk

  14. Télécharger la version officielle d’Eclipse Temurin à vérifier

    Téléchargez et décompressez le JDK Temurin à vérifier :

    curl -L -o temurin-windows-x64-jdk-21.0.4+7.zip https://api.adoptium.net/v3/binary/version/jdk-21.0.4+7/windows/x64/jdk/hotspot/normal/adoptium
    unzip temurin-windows-x64-jdk-21.0.4+7.zip
  15. Télécharger et configurer les outils de comparaison de builds reproductibles de temurin-build d’Adoptium pour Windows

    En raison des « signatures de code » de Temurin sur les fichiers .exe/.dll Windows, un traitement est nécessaire pour supprimer les signatures numériques uniques à l’aide de l’outil signtool.exe de Windows. Pour faciliter ce processus et effectuer la comparaison, les outils temurin-build d’Adoptium fournissent un script de comparaison reproductible.

    Effectuez les étapes suivantes pour cloner et configurer votre environnement afin d’exécuter le script de comparaison reproductible de temurin-build :

    • git clone https://github.com/adoptium/temurin-build.git

    • cd temurin-build/tooling

    • Compilez BinRepl.java :

      javac src/java/temurin/tools/BinRepl.java
    • Trouvez « signtool.exe » et ajoutez-le au PATH, par exemple :

      export PATH=/cygdrive/c/progra~2/wi3cf2~1/10/bin/10.0.22621.0/x64:$PATH
    • Trouvez « dumpbin.exe » et ajoutez-le au PATH, par exemple :

      export PATH=/cygdrive/c/progra~2/micros~2/2022/BuildTools/VC/Tools/MSVC/14.37.32822/bin/Hostx64/x64:$PATH
    • cd reproducible

    • Définissez CLASSPATH pour trouver le BinRepl.class compilé, par exemple :

      export CLASSPATH=../src/java
  16. Vérifier que la recompilation locale sécurisée est identique au binaire officiel d’Eclipse Temurin

    Comparez la recompilation locale avec le JDK officiel d’Eclipse Temurin. Ce script implique le décompactage des jmod et la suppression de toutes les « Signatures » uniques de Temurin ; ce processus prend un certain temps (environ 30 minutes) :

    bash ./repro_compare.sh temurin ~/jdk-21.0.4+7 openjdk /cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk CYGWIN

    Pour une vérification réussie, le script doit afficher un résultat reproductible de 100 %.

    Comparing /home/user/jdk-21.0.4+7 with /cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk ... output to file: reprotest.diff
    Number of differences: 0
    ReproduciblePercent = 100 %
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