在 Linux x64 上进行 Temurin 可重现验证构建

以下说明详细介绍了在安全构建环境中从"源码"完全相同地重新构建 Linux x64 平台上给定 Eclipse Temurin 发布版本的可重现构建过程。整个过程以安全的方式进行,仅使用上游源码和经安全验证的构建工具,以提供一种安全验证给定 Eclipse Temurin 发布二进制文件的机制。此验证有助于确定用于构建 Eclipse Temurin 官方发布二进制文件的供应链的安全性。

该流程包含以下步骤:

  • 构建环境设置

  • 从"源码"构建与 Eclipse Adoptium 使用的完全相同的 gcc DevKit

  • 确定与 Eclipse Temurin 选项匹配的 OpenJDK make 配置参数

  • 构建本地 Eclipse Temurin JDK

  • 将安全的本地 Eclipse Temurin 重新构建与官方 Eclipse Temurin 二进制文件进行比较

Linux x64 可重现验证构建流程

  1. 构建环境

    要在 Linux x64 上完全相同地重新构建 Eclipse Temurin,需要适合的 7 或 8 版本的 Centos 或 RHEL。

  2. 安装 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. 安装构建工具

    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. 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
  5. 设置时区为 UTC

    为确保构建结果完全相同,构建时区必须为 UTC 以确保二进制文件输出完全一致:

    timedatectl set-timezone UTC
  6. 下载 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
  7. 从源码构建 gcc DevKit 工具链

    bash ./make_devkit.sh jdk21u x86_64 Centos 7.9.2009

    构建好的"DevKit 路径"将位于文件夹 jdk21u/build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu 中。

    设置 LD_LIBRARY_PATH 以定位新构建的 DevKit 库:

    export LD_LIBRARY_PATH=<DevKit path>/lib64:<DevKit path>/lib
  8. 下载待验证的 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_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. 确定要构建的上游 OpenJDK 源码标签

    打开 SBOM json 文件并确定发布版本所基于的"SCM Ref":

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

    上游 OpenJDK 标签是去掉"_adopt"后的值,例如"jdk-21.0.4+7"。

  10. 下载合适的 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_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

    确保显示"来自 Adoptium GPG 密钥(DEB/RPM 签名密钥)的有效签名"。

    解压到合适的文件夹:

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

    添加到 PATH 环境变量:

    export PATH=<bootjdk>/bin:$PATH
  11. 克隆所需的上游 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>)
  12. 创建本地构建目录

    mkdir openjdk_build
  13. 配置构建

    确定并编辑"configure 参数"以匹配您的本地环境:

    1. 确定此构建的 configure 参数

      使用以下 grep 命令从 SBOM-metadata.json 中查找所需的 configure 参数:

      grep "using configure arguments" <SBOM-metadata.json> | sed -n -e "s/^.*using configure arguments '\(.*\)'\..*/\1/p"
    2. 将 -–with-devkit=<path> 替换为本地构建的 gcc DevKit 路径 "<path>/jdk21u/build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu"。

    3. 删除 -–with-cacerts-src=<path>,因为 Temurin 使用 Mozilla CA 证书构建,而本地构建将使用标准 OpenJDK CA 证书。

    4. 将 -–with-boot-jdk=<path> 替换为上面解压的本地 Boot JDK 路径。

      从"openjdk_build"目录进行配置:

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

    make images
  15. 删除与可重现构建比较无关的构建镜像输出

    1. "cacerts":Temurin 使用自己的 Mozilla CA 证书列表构建(需从 lib/security 和 java.base/lib/security 中删除)

    2. "release":"release" 文本描述文件因构建 OS 环境不同和 Temurin 额外元数据而有所差异

    3. "demo":Temurin 不附带"demo"示例文件

    4. "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 ..
  16. 下载官方 Eclipse Temurin 发布版本用于"验证"

    下载并解压待验证的 Temurin JDK:

    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. 删除相同的无关文件

    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. 验证本地安全重新构建与官方 Eclipse Temurin 二进制文件完全相同

    比较两个镜像:

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

    验证成功时,应无任何差异。

edit icon

帮助我们完善这些文档!

所有 Adoptium 文档均为开源。发现错误或不清楚的内容?

文档作者
andrew-m-leonardgdams
Join our Slack channel to discuss and reach out to maintainers.Join Slack