以下说明详细介绍了在安全构建环境中从"源码"完全相同地重新构建 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 可重现验证构建流程
-
构建环境
要在 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
-
-
确保 Windows 系统时区为 UTC 以确保构建完全相同
通过检查 Windows 设置 → "时间和语言" → "日期和时间" → "时区" 的值,将 Windows"时区"设置为 UTC。
-
卸载任何程序或更改时区后,重新启动 Windows 计算机。
-
安装所需版本的 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++ 的桌面开发"
-
点击"安装"
-
-
安装所需的构建依赖项:
安装 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 -
打开 Cygwin 终端窗口以在其中执行构建
双击桌面上的"Cygwin Terminal"图标打开运行 bash shell 的新 Cygwin 终端。
-
确定重现目标 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 -
确定要构建的上游 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 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 -
克隆所需的上游 OpenJDK 源码
将 jdk21u 替换为正在构建的上游发布版本:
git clone https://github.com/openjdk/jdk21u.git # Checkout required tag to build (cd jdk21u && git checkout <OpenJDK tag to build>) -
创建特定的本地构建目录
注意:这仅对 jdk-21.0.4+7 是必需的,因为存在可重现构建问题(https://github.com/adoptium/temurin-build/issues/3790)。对于更高版本,此步骤不是必需的。
为构建创建以下精确的本地构建目录,路径必须完全匹配才能使构建完全可重现:
mkdir -p C:/workspace/openjdk-build/workspace/build/openjdkbuild -
配置构建
确定并编辑"configure 参数"以匹配您的本地环境:
-
确定此构建的 configure 参数
使用以下 grep 命令从 SBOM-metadata.json 中查找所需的 configure 参数:
grep "using configure arguments" <SBOM-metadata.json> | sed -n -e "s/^.*using configure arguments '\(.*\)'\..*/\1/p" -
删除 -–with-cacerts-src=<path>,因为 Temurin 使用 Mozilla CA 证书构建,而本地构建将使用标准 OpenJDK CA 证书。
-
更新 --with-ucrt-dll-dir=<path>,确保它与您本地计算机上的位置匹配,指定:
--with-ucrt-dll-dir='C:/Program Files (x86)/Windows Kits/10/Redist/10.0.22621.0/ucrt/DLLs/x64' -
将 -–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>
-
-
构建 Temurin
make images构建好的镜像将位于目录:/cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk 下。
-
下载官方 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 -
下载并设置 Adoptium temurin-build 可重现构建比较工具(用于 Windows)
由于 Temurin 对 Windows .exe/dll 文件进行了"签名",需要使用 Windows signtool.exe 工具删除唯一的数字签名进行处理。为辅助此过程并执行比较,Adoptium temurin-build 工具提供了可重现比较脚本。
执行以下步骤克隆并设置您的环境以运行 temurin-build 可重现比较脚本:
-
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
-
验证本地安全重新构建与官方 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 %

