Build de verificación reproducible de Temurin en Windows x64

Las siguientes instrucciones detallan el proceso de reconstrucción idéntica desde "fuente" en un entorno de compilación seguro, de un build reproducible para una versión determinada de Eclipse Temurin en la plataforma Windows x64. El proceso se realiza de forma segura, utilizando únicamente las fuentes originales y las herramientas de compilación oficiales de Microsoft Visual Studio, con el fin de proporcionar un mecanismo para verificar de manera segura el binario de la versión de Eclipse Temurin. Esta verificación ayuda a determinar la seguridad de las cadenas de suministro utilizadas para compilar los binarios oficiales de Eclipse Temurin.

El procedimiento consta de los siguientes pasos:

  • Configuración del entorno de compilación

  • Instalar la versión requerida de Microsoft Visual Studio Build Tools para el compilador C/C++

  • Determinar los argumentos de configuración de make de OpenJDK que coincidan con las opciones de Eclipse Temurin

  • Compilar el JDK de Eclipse Temurin localmente

  • Comparar la recompilación local segura de Eclipse Temurin con el binario oficial de Eclipse Temurin, utilizando el script de comparación de builds reproducibles de temurin-build de Adoptium, que ajusta la comparación frente a ejecutables nativos "firmados"

Procedimiento de build de verificación reproducible en Windows x64

  1. Entorno de compilación

    Para recompilar Eclipse Temurin de forma idéntica en Windows x64, se requiere un entorno de compilación Windows adecuado con exactamente las mismas Microsoft Visual Studio Build Tools requeridas, y es necesario eliminar cualquier versión conflictiva anterior.

    Asegúrese de desinstalar cualquier componente anterior de Microsoft Visual Studio mediante Configuración de Windows → "Agregar o quitar programas", incluyendo:

    • Visual Studio <Edición> 20xx …​

    • Microsoft C++ <año..año> Redistributables

    • Microsoft Visual Studio Installer

    • Windows Software Development Kit

    • Windows SDK Addon

  2. Asegúrese de que la zona horaria del sistema Windows sea UTC para garantizar un build idéntico

    Establezca la "Zona horaria" de Windows en UTC, comprobando el valor en Configuración de Windows → "Hora e idioma" → "Fecha y hora" → "Zona horaria".

  3. Reinicie el equipo Windows después de desinstalar programas o cambiar la zona horaria.

  4. Instalar la versión requerida de Microsoft Visual Studio

    Instale Microsoft Visual Studio VS2022 edición "Build Tools" versión 17.7.3, que contiene la versión 19.37.32822 del compilador C/C++:

  5. Instalar las dependencias de compilación requeridas:

    Instale Cygwin con las dependencias necesarias para compilar 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"

    Asumiendo que setup-x86_64.exe es seguro y la verificación GPG reporta "Good signature", instale 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. Abra una ventana de terminal de Cygwin para realizar la compilación desde ella

    Haga doble clic en el icono del escritorio "Cygwin Terminal" para abrir una nueva terminal Cygwin ejecutando el shell bash

  7. Determinar la configuración de compilación requerida para reproducir la versión de Eclipse Temurin objetivo

    Para la versión requerida de Eclipse Temurin, descargue el SBOM y los metadatos del SBOM del repositorio oficial de binarios de Adoptium, por ejemplo para 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. Determinar la etiqueta de fuente de OpenJDK a compilar

    Abra el archivo SBOM json y determine la "SCM Ref" a partir de la cual se compiló la versión

    {
      "name" : "SCM Ref",
      "value" : "jdk-21.0.4+7_adopt"
    },

    La etiqueta de OpenJDK es este valor sin el sufijo "_adopt", por ejemplo, "jdk-21.0.4+7"

  9. Descargar un Boot JDK adecuado

    Para compilar Temurin necesita un Boot JDK adecuado. Abra el archivo SBOM json y determine la versión utilizada para compilar la versión

    {
      "name" : "BOOTJDK",
      "version" : "20.0.2+9"
    },

    Descargue y verifique de forma segura la versión requerida desde 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

    Asegúrese de obtener "Good signature from Adoptium GPG Key (DEB/RPM Signing Key)"

    Descomprima en una carpeta adecuada

    unzip OpenJDK20U-jdk_x64_windows_hotspot_20.0.2_9.zip

    Agregue al entorno PATH para que las herramientas java y javac estén disponibles para los scripts utilizados posteriormente en estas instrucciones.

    export PATH=<bootjdk>/bin:$PATH
  10. Clonar las fuentes de OpenJDK requeridas

    Reemplace jdk21u con la versión que se va a compilar

    git clone https://github.com/openjdk/jdk21u.git
    # Checkout required tag to build
    (cd jdk21u && git checkout <OpenJDK tag to build>)
  11. Crear un directorio de compilación local específico

    Nota: Esto es necesario SOLO para jdk-21.0.4+7 debido a un problema de build reproducible (https://github.com/adoptium/temurin-build/issues/3790). Para versiones posteriores no es necesario.

    Cree el siguiente directorio de compilación local exacto. La ruta debe coincidir para que el build sea idénticamente reproducible.

    mkdir -p C:/workspace/openjdk-build/workspace/build/openjdkbuild
  12. Configurar la compilación

    Determine y edite los "configure args" para que coincidan con su entorno local

    1. Determinar los argumentos de configuración para esta compilación

      Use el siguiente grep para encontrar los argumentos de configuración requeridos en el SBOM-metadata.json

      grep "using configure arguments" <SBOM-metadata.json> | sed -n -e "s/^.*using configure arguments '\(.*\)'\..*/\1/p"
    2. Elimine -–with-cacerts-src=<path>, ya que Temurin se compila con los certificados CA de Mozilla, mientras que la compilación local utilizará los certificados CA estándar de OpenJDK.

    3. Actualice --with-ucrt-dll-dir=<path> para asegurarse de que coincida con la ubicación en su máquina local, especifique:

      --with-ucrt-dll-dir='C:/Program Files (x86)/Windows Kits/10/Redist/10.0.22621.0/ucrt/DLLs/x64'
    4. Reemplace -–with-boot-jdk=<path> con la ruta al boot JDK descomprimido localmente.

      Configure desde el directorio "C:/workspace/openjdk-build/workspace/build/openjdkbuild"

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

    make images

    La imagen compilada estará disponible en el directorio: /cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk

  14. Descargar la versión oficial de Eclipse Temurin a verificar

    Descargue y descomprima el JDK de Temurin a verificar:

    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. Descargar y configurar las herramientas de comparación de builds reproducibles de temurin-build de Adoptium para Windows

    Debido a las "firmas de código" de Temurin en los archivos .exe/.dll de Windows, es necesario procesar y eliminar las firmas digitales únicas utilizando la herramienta signtool.exe de Windows. Para facilitar este proceso y realizar la comparación, las herramientas de temurin-build de Adoptium proporcionan un script de comparación reproducible.

    Realice los siguientes pasos para clonar y configurar su entorno para ejecutar el script de comparación reproducible de temurin-build:

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

    • cd temurin-build/tooling

    • Compile BinRepl.java:

      javac src/java/temurin/tools/BinRepl.java
    • Busque "signtool.exe" y agréguelo al PATH, por ejemplo:

      export PATH=/cygdrive/c/progra~2/wi3cf2~1/10/bin/10.0.22621.0/x64:$PATH
    • Busque "dumpbin.exe" y agréguelo al PATH, por ejemplo:

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

    • Establezca CLASSPATH para localizar el BinRepl.class compilado, por ejemplo:

      export CLASSPATH=../src/java
  16. Verificar que la recompilación local segura sea idéntica al binario oficial de Eclipse Temurin

    Compare la recompilación local con el JDK oficial de Eclipse Temurin. Este script implica desempaquetar los jmod y eliminar todas las "Firmas" únicas de Temurin; este proceso tarda un tiempo en completarse (aproximadamente 30 minutos):

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

    Para una verificación exitosa, el script debe reportar un resultado reproducible del 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

¡Ayúdanos a mejorar esta documentación!

Toda la documentación de Adoptium es de código abierto. ¿Has encontrado algo incorrecto o confuso?

Autores de la documentación
andrew-m-leonardgdams
Join our Slack channel to discuss and reach out to maintainers.Join Slack