以下说明详细介绍了在安全构建环境中从"源码"完全相同地重新构建 Linux aarch64 平台上给定 Eclipse Temurin 发布版本的可重现构建过程。整个过程以安全的方式进行,仅使用上游源码和经安全验证的构建工具,以提供一种安全验证给定 Eclipse Temurin 发布二进制文件的机制。此验证有助于确定用于构建 Eclipse Temurin 官方发布二进制文件的供应链的安全性。
该流程包含以下步骤:
-
构建环境设置
-
从"源码"构建与 Eclipse Adoptium 使用的完全相同的 gcc DevKit
-
确定与 Eclipse Temurin 选项匹配的 OpenJDK make 配置参数
-
构建本地 Eclipse Temurin JDK
-
将安全的本地 Eclipse Temurin 重新构建与官方 Eclipse Temurin 二进制文件进行比较
Linux aarch64 可重现验证构建流程
-
构建环境
要在 Linux aarch64 上完全相同地重新构建 Eclipse Temurin,需要适合的 7 或 8 版本的 Centos 或 RHEL。
-
安装 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 -
安装构建工具
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 -
GNU make 版本 >= 4?
GNU make 必须至少为第 4 版,才能构建 gcc DevKit。
检查 GNU make 版本:
make --version如果版本低于 4,请按如下方式下载并构建 GNU make 4.3:
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 -
设置时区为 UTC
为确保构建结果完全相同,构建时区必须为 UTC 以确保二进制文件输出完全一致:
timedatectl set-timezone UTC -
下载 Adoptium DevKit 工具链 make 脚本文件
为了安全且完全相同地构建 gcc DevKit 工具链,请从 Eclipse Adoptium 仓库安全下载以下脚本。这些脚本和补丁使 DevKit make 过程能够使用 Centos sysroot 构建,并支持 GPG 验证 Centos RPM 下载以进行额外的完整性检查。
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 -
从源码构建 gcc DevKit 工具链
bash ./make_devkit.sh jdk21u aarch64 Centos 7.6.1810构建好的"DevKit 路径"将位于文件夹 jdk21u/build/devkit/result/aarch64-linux-gnu-to-aarch64-linux-gnu 中。
设置 LD_LIBRARY_PATH 以定位新构建的 DevKit 库:
export LD_LIBRARY_PATH=<DevKit path>/lib64:<DevKit path>/lib -
下载待验证的 Eclipse Temurin 构建的 SBOM
例如,下载发布版本 jdk-21.0.4+7 的 SBOM 和 SBOM 元数据:
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 -
确定要构建的上游 OpenJDK 源码标签
打开 SBOM json 文件并确定发布版本所基于的"SCM Ref":
{ "name" : "SCM Ref", "value" : "jdk-21.0.4+7_adopt" },上游 OpenJDK 标签是去掉"_adopt"后的值,例如"jdk-21.0.4+7"。
-
下载合适的 Boot JDK
要构建 Temurin,您需要一个合适的 Boot JDK。打开 SBOM json 文件并确定构建该发布版本所使用的版本:
{ "name" : "BOOTJDK", "version" : "20.0.2+9" },从 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.gz确保显示"来自 Adoptium GPG 密钥(DEB/RPM 签名密钥)的有效签名"。
解压到合适的文件夹:
tar -xf OpenJDK20U-jdk_aarch64_linux_hotspot_20.0.2_9.tar.gz添加到 PATH 环境变量:
export PATH=<bootjdk>/bin:$PATH -
克隆所需的上游 OpenJDK 源码
将 jdk21u 替换为正在构建的上游发布版本:
git clone https://github.com/openjdk/jdk21u.git jdk21u_bld # Checkout required tag to build (cd jdk21u_bld && git checkout <OpenJDK tag to build>) -
创建本地构建目录
mkdir openjdk_build -
配置构建
确定并编辑"configure 参数"以匹配您的本地环境:
-
确定此构建的 configure 参数
使用以下 grep 命令从 SBOM-metadata.json 中查找所需的 configure 参数:
grep "using configure arguments" <SBOM-metadata.json> | sed -n -e "s/^.*using configure arguments '\(.*\)'\..*/\1/p" -
将 -–with-devkit=<path> 替换为本地构建的 gcc DevKit 路径 "<path>/jdk21u/build/devkit/result/aarch64-linux-gnu-to-aarch64-linux-gnu"。
-
删除 -–with-cacerts-src=<path>,因为 Temurin 使用 Mozilla CA 证书构建,而本地构建将使用标准 OpenJDK CA 证书。
-
将 -–with-boot-jdk=<path> 替换为上面解压的本地 Boot JDK 路径。
从"openjdk_build"目录进行配置:
cd openjdk_build bash ../jdk21u_bld/configure <edited configure args>
-
-
构建 Temurin
make images -
删除与可重现构建比较无关的构建镜像输出
-
"cacerts":Temurin 使用自己的 Mozilla CA 证书列表构建(需从 lib/security 和 java.base/lib/security 中删除)
-
"release":"release" 文本描述文件因构建 OS 环境不同和 Temurin 额外元数据而有所差异
-
"demo":Temurin 不附带"demo"示例文件
-
"debuginfo":Temurin JDK 压缩包不包含 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 ..
-
-
下载官方 Eclipse Temurin 发布版本用于"验证"
下载并解压待验证的 Temurin JDK:
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 -
删除相同的无关文件
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 -
验证本地安全重新构建与官方 Eclipse Temurin 二进制文件完全相同
比较两个镜像:
diff -r openjdk_build/images/jdk jdk-21.0.4+7验证成功时,应无任何差异。

