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 aarch64. 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 aarch64
-
Entorno de compilación
Para recompilar Eclipse Temurin de forma idéntica en Linux aarch64, se requiere un sistema Centos o RHEL adecuado, de versión 7 u 8.
-
Instalar herramientas 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 -
Instalar herramientas de compilación
yum install -y tar git patch gcc gcc-c++ wget bison texinfo lbzip2 zip unzip glibc glibc-devel libgcc yum install -y autoconf systemtap systemtap-sdt-devel -
¿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 --versionSi 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 -
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 -
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 -
Compilar el gcc DevKit Toolchain desde la fuente
bash ./make_devkit.sh jdk21u aarch64 Centos 7.6.1810La ruta del "DevKit compilado" estará en la carpeta jdk21u/build/devkit/result/aarch64-linux-gnu-to-aarch64-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 -
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_aarch64_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_aarch64_linux_hotspot_21.0.4_7-metadata.json -
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"
-
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_aarch64_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_aarch64_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_aarch64_linux_hotspot_20.0.2_9.tar.gz.sig OpenJDK20U-jdk_aarch64_linux_hotspot_20.0.2_9.tar.gzAsegúrese de obtener "Good signature from Adoptium GPG Key (DEB/RPM Signing Key)"
Descomprima en una carpeta adecuada
tar -xf OpenJDK20U-jdk_aarch64_linux_hotspot_20.0.2_9.tar.gzAgregue al entorno PATH
export PATH=<bootjdk>/bin:$PATH -
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>) -
Crear un directorio de compilación local
mkdir openjdk_build -
Configurar la compilación
Determine y edite los "configure args" para que coincidan con su entorno local
-
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" -
Reemplace -–with-devkit=<path> con la ruta al gcc DevKit compilado localmente "<path>/jdk21u/build/devkit/result/aarch64-linux-gnu-to-aarch64-linux-gnu".
-
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.
-
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>
-
-
Compilar Temurin
make images -
Eliminar los archivos de salida del build que no son relevantes para la comparación del build reproducible
-
"cacerts": Temurin se compila con su propia lista de certificados CA de Mozilla (debe eliminarse de lib/security y java.base/lib/security)
-
"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
-
"demo": Temurin no incluye los archivos de ejemplo "demo"
-
"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 ..
-
-
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-aarch64-jdk-21.0.4+7.tar.gz https://api.adoptium.net/v3/binary/version/jdk-21.0.4+7/linux/aarch64/jdk/hotspot/normal/adoptium tar -xf temurin-linux-aarch64-jdk-21.0.4+7.tar.gz -
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 -
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+7Para una verificación exitosa no debe haber diferencias.

