Build de verificación reproducible de Temurin en Linux 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 Linux x64. El proceso se realiza de forma segura, utilizando únicamente las fuentes originales y herramientas de compilación verificadas de forma segura, 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

  • Compilar el gcc DevKit desde "fuente", idéntico al utilizado por Eclipse Adoptium

  • 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

Procedimiento de build de verificación reproducible en Linux x64

  1. Entorno de compilación

    Para recompilar Eclipse Temurin de forma idéntica en Linux x64, se requiere un sistema Centos o RHEL adecuado, de versión 7 u 8.

  2. Instalar herramientas 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. Instalar herramientas de compilación

    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. ¿Versión de GNU make >= 4?

    GNU make debe ser al menos la versión 4 para poder compilar el gcc DevKit.

    Verifique la versión de GNU make

    make --version

    Si no es al menos la versión 4, descargue y compile GNU make 4.3 de la siguiente manera:

    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. Establecer la zona horaria en UTC

    Para obtener builds idénticos, la zona horaria de compilación debe ser UTC a fin de garantizar una salida binaria exacta

    timedatectl set-timezone UTC
  6. Descargar los archivos de script make del DevKit Toolchain de Adoptium

    Para compilar de forma segura e idéntica un gcc DevKit Toolchain, descargue de forma segura los siguientes scripts del repositorio de Eclipse Adoptium. Estos scripts y parches permiten que el proceso de make del DevKit compile con un sysroot de Centos y también habilitan la descarga verificada por GPG de los RPM de Centos para una verificación de integridad adicional.

    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. Compilar el gcc DevKit Toolchain desde la fuente

    bash ./make_devkit.sh jdk21u x86_64 Centos 7.9.2009

    La ruta del "DevKit compilado" estará en la carpeta jdk21u/build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu

    Establezca LD_LIBRARY_PATH para localizar las bibliotecas del DevKit recién compilado

    export LD_LIBRARY_PATH=<DevKit path>/lib64:<DevKit path>/lib
  8. Descargar el SBOM del build de Eclipse Temurin a verificar

    Por ejemplo, para descargar el SBOM y los metadatos del SBOM para la versión 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. 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"

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

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

    Descomprima en una carpeta adecuada

    tar -xf OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gz

    Agregue al entorno PATH

    export PATH=<bootjdk>/bin:$PATH
  11. 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 jdk21u_bld
    # Checkout required tag to build
    (cd jdk21u_bld && git checkout <OpenJDK tag to build>)
  12. Crear un directorio de compilación local

    mkdir openjdk_build
  13. 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. Reemplace -–with-devkit=<path> con la ruta al gcc DevKit compilado localmente "<path>/jdk21u/build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu".

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

    4. Reemplace -–with-boot-jdk=<path> con la ruta al boot JDK descomprimido localmente.

      Configure desde el directorio "openjdk_build"

      cd openjdk_build
      bash ../jdk21u_bld/configure <edited configure args>
  14. Compilar Temurin

    make images
  15. Eliminar los archivos de salida del build que no son relevantes para la comparación del build reproducible

    1. "cacerts": Temurin se compila con su propia lista de certificados CA de Mozilla (debe eliminarse de lib/security y java.base/lib/security)

    2. "release": el archivo de descripción de texto "release" difiere debido al entorno del sistema operativo de compilación y a los metadatos adicionales de Temurin

    3. "demo": Temurin no incluye los archivos de ejemplo "demo"

    4. "debuginfo": el tarball del JDK de Temurin no contiene 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. Descargar la versión oficial de Eclipse Temurin para "Verificación"

    Descargue y descomprima el JDK de Temurin a verificar:

    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. Eliminar los mismos archivos no relevantes

    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. Verificar que la recompilación local segura sea idéntica al binario oficial de Eclipse Temurin

    Compare las dos imágenes

    diff -r openjdk_build/images/jdk jdk-21.0.4+7

    Para una verificación exitosa no debe haber diferencias.

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