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

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

该流程包含以下步骤:

  • 构建环境设置

  • 安装 C/C++ 编译器所需版本的 Microsoft Visual Studio 构建工具版本

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

  • 构建本地 Eclipse Temurin JDK

  • 使用 Adoptium temurin-build 比较脚本将安全的本地 Eclipse Temurin 重新构建与官方 Eclipse Temurin 二进制文件进行比较,该脚本会调整与"已签名"本机可执行文件的比较

Windows x64 可重现验证构建流程

  1. 构建环境

    要在 Windows x64 上完全相同地重新构建 Eclipse Temurin,需要具有完全相同的所需 Microsoft Visual Studio 构建工具的适当 Windows 构建环境,并且必须删除所有可能存在冲突的旧版本。

    使用 Windows 设置 → "添加或删除程序" 卸载所有以前的 Microsoft Visual Studio 组件,包括:

    • Visual Studio <版本> 20xx …​

    • Microsoft C++ <年份..年份> Redistributables

    • Microsoft Visual Studio Installer

    • Windows Software Development Kit

    • Windows SDK Addon

  2. 确保 Windows 系统时区为 UTC 以确保构建完全相同

    通过检查 Windows 设置 → "时间和语言" → "日期和时间" → "时区" 的值,将 Windows"时区"设置为 UTC。

  3. 卸载任何程序或更改时区后,重新启动 Windows 计算机。

  4. 安装所需版本的 Microsoft Visual Studio

    安装包含 C/C++ 编译器版本 19.37.32822 的 Microsoft Visual Studio VS2022"Build Tools"版本 17.7.3:

    • 下载并执行:https://download.visualstudio.microsoft.com/download/pr/1d66edfe-3c83-476b-bf05-e8901c62ba7f/bac71effb5a23d7cd1a81e5f628a0c8dcb7e8a07e0aa7077c853ed84a862dceb/vs_BuildTools.exe

    • 选择"工作负载" → "使用 C++ 的桌面开发"

    • 点击"安装"

  5. 安装所需的构建依赖项:

    安装 Cygwin 及构建 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"

    假设 setup-x86_64.exe 是安全的且 GPG 验证报告"Good signature",则安装 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. 打开 Cygwin 终端窗口以在其中执行构建

    双击桌面上的"Cygwin Terminal"图标打开运行 bash shell 的新 Cygwin 终端。

  7. 确定重现目标 Eclipse Temurin 发布所需的构建配置

    对于所需的 Eclipse Temurin 发布版本,从官方 Adoptium 发布二进制仓库下载 SBOM 和 SBOM 元数据,例如 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. 确定要构建的上游 OpenJDK 源码标签

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

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

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

  9. 下载合适的 Boot JDK

    要构建 Temurin,您需要一个合适的 Boot JDK。打开 SBOM json 文件并确定构建该发布版本所使用的版本:

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

    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

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

    解压到合适的文件夹:

    unzip OpenJDK20U-jdk_x64_windows_hotspot_20.0.2_9.zip

    添加到 PATH 环境变量,以便后续说明中使用的脚本可以使用 java 和 javac 工具:

    export PATH=<bootjdk>/bin:$PATH
  10. 克隆所需的上游 OpenJDK 源码

    将 jdk21u 替换为正在构建的上游发布版本:

    git clone https://github.com/openjdk/jdk21u.git
    # Checkout required tag to build
    (cd jdk21u && git checkout <OpenJDK tag to build>)
  11. 创建特定的本地构建目录

    注意:这仅对 jdk-21.0.4+7 是必需的,因为存在可重现构建问题(https://github.com/adoptium/temurin-build/issues/3790)。对于更高版本,此步骤不是必需的。

    为构建创建以下精确的本地构建目录,路径必须完全匹配才能使构建完全可重现:

    mkdir -p C:/workspace/openjdk-build/workspace/build/openjdkbuild
  12. 配置构建

    确定并编辑"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-cacerts-src=<path>,因为 Temurin 使用 Mozilla CA 证书构建,而本地构建将使用标准 OpenJDK CA 证书。

    3. 更新 --with-ucrt-dll-dir=<path>,确保它与您本地计算机上的位置匹配,指定:

      --with-ucrt-dll-dir='C:/Program Files (x86)/Windows Kits/10/Redist/10.0.22621.0/ucrt/DLLs/x64'
    4. 将 -–with-boot-jdk=<path> 替换为上面解压的本地 Boot JDK 路径。

      从"C:/workspace/openjdk-build/workspace/build/openjdkbuild"目录进行配置:

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

    make images

    构建好的镜像将位于目录:/cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk 下。

  14. 下载官方 Eclipse Temurin 发布版本用于验证

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

    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. 下载并设置 Adoptium temurin-build 可重现构建比较工具(用于 Windows)

    由于 Temurin 对 Windows .exe/dll 文件进行了"签名",需要使用 Windows signtool.exe 工具删除唯一的数字签名进行处理。为辅助此过程并执行比较,Adoptium temurin-build 工具提供了可重现比较脚本。

    执行以下步骤克隆并设置您的环境以运行 temurin-build 可重现比较脚本:

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

    • cd temurin-build/tooling

    • 编译 BinRepl.java:

      javac src/java/temurin/tools/BinRepl.java
    • 找到"signtool.exe"并添加到 PATH,例如:

      export PATH=/cygdrive/c/progra~2/wi3cf2~1/10/bin/10.0.22621.0/x64:$PATH
    • 找到"dumpbin.exe"并添加到 PATH,例如:

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

    • 设置 CLASSPATH 以找到已编译的 BinRepl.class,例如:

      export CLASSPATH=../src/java
  16. 验证本地安全重新构建与官方 Eclipse Temurin 二进制文件完全相同

    将本地重新构建与 Eclipse Temurin 官方 JDK 进行比较。此脚本涉及解包 jmod 文件并删除所有唯一的 Temurin 签名"Signatures",此过程需要一段时间(大约 30 分钟):

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

    验证成功时,脚本应报告 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

帮助我们完善这些文档!

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

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