Build de Verificação Reproduzível do Temurin no Windows x64

As instruções a seguir detalham o processo de reconstrução idêntica a partir do "código-fonte" em um ambiente de build seguro, um build reproduzível para um dado lançamento do Eclipse Temurin na plataforma Windows x64. O processo é realizado de forma segura, usando apenas as fontes upstream e as ferramentas de build oficiais do Microsoft Visual Studio, de modo a fornecer um mecanismo para verificar de forma segura o binário do lançamento dado do Eclipse Temurin. Essa verificação ajuda então a determinar a segurança das cadeias de fornecimento usadas para construir os binários de lançamento oficial do Eclipse Temurin.

O procedimento consiste nas seguintes etapas:

  • Configuração do ambiente de build

  • Instalação da versão necessária do Microsoft Visual Studio Builds Tools edition para o compilador C/C++

  • Determinação dos argumentos de configuração make do OpenJDK correspondentes às opções do Eclipse Temurin

  • Construção do Eclipse Temurin JDK local

  • Comparação da reconstrução local segura do Eclipse Temurin com o binário oficial do Eclipse Temurin, usando o script de comparação de build reproduzível do Adoptium temurin-build que ajusta para comparação com executáveis nativos "assinados"

Procedimento de build de verificação reproduzível no Windows x64

  1. Ambiente de Build

    Para reconstruir identicamente o Eclipse Temurin no Windows x64, é necessário um ambiente de build Windows adequado com as mesmas Microsoft Visual Studio Build Tools necessárias, e é preciso remover quaisquer versões conflitantes anteriores.

    Certifique-se de que todos os componentes anteriores do Microsoft Visual Studio estejam desinstalados usando Configurações do Windows→"Adicionar ou remover programas", incluindo:

    • Visual Studio <Edition> 20xx …​

    • Microsoft C++ <year..year> Redistributables

    • Microsoft Visual Studio Installer

    • Windows Software Development Kit

    • Windows SDK Addon

  2. Certifique-se de que o fuso horário do sistema Windows seja UTC para garantir um build idêntico

    Defina o "Fuso horário" do Windows como UTC, verificando em Configurações do Windows→"Hora e Idioma" → "Data e hora" → valor de "Fuso horário".

  3. Reinicie a máquina Windows após desinstalar qualquer programa ou alterar o Fuso Horário.

  4. Instalar a versão necessária do Microsoft Visual Studio

    Instale o Microsoft Visual Studio VS2022 edição "Build Tools" versão 17.7.3 que contém a versão 19.37.32822 do compilador C/C++:

  5. Instalar dependências de build necessárias:

    Instale o Cygwin com as dependências necessárias para construir o 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"

    Assumindo que setup-x86_64.exe seja seguro e que a verificação GPG reporte "Good signature", então instale o 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. Inicie uma janela de terminal Cygwin para realizar o build a partir dela

    Clique duas vezes no ícone "Cygwin Terminal" na área de trabalho para abrir um novo terminal Cygwin executando o bash shell

  7. Determinar a configuração de build necessária para reproduzir o lançamento alvo do Eclipse Temurin

    Para a versão do lançamento do Eclipse Temurin necessária, baixe o SBOM e os metadados do SBOM do repositório oficial de binários do Adoptium, por exemplo, para 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. Determinar a tag do código-fonte OpenJDK upstream a ser construída

    Abra o arquivo SBOM json e determine o "SCM Ref" a partir do qual o lançamento foi construído

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

    A tag OpenJDK upstream é esse valor sem o "_adopt", por exemplo "jdk-21.0.4+7"

  9. Baixar um Boot JDK adequado

    Para construir o Temurin você precisa de um Boot JDK adequado, abra o arquivo SBOM json e determine a versão usada para construir o lançamento

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

    Baixe e verifique de forma segura a versão necessária em 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

    Certifique-se de "Good signature from Adoptium GPG Key (DEB/RPM Signing Key)"

    Descompacte em uma pasta adequada

    unzip OpenJDK20U-jdk_x64_windows_hotspot_20.0.2_9.zip

    Adicione ao ambiente PATH, para que as ferramentas java e javac estejam disponíveis para os scripts usados posteriormente nestas instruções.

    export PATH=<bootjdk>/bin:$PATH
  10. Clonar o código-fonte OpenJDK upstream necessário

    Substitua jdk21u pelo lançamento upstream que está sendo construído

    git clone https://github.com/openjdk/jdk21u.git
    # Checkout required tag to build
    (cd jdk21u && git checkout <OpenJDK tag to build>)
  11. Criar um diretório de build local específico

    Nota: Isso é necessário APENAS para jdk-21.0.4+7 devido a um problema de build reproduzível (https://github.com/adoptium/temurin-build/issues/3790). Para versões posteriores isso é desnecessário.

    Crie o seguinte diretório de build local exato para o build; o caminho deve corresponder a este para que o build seja reproduzível de forma idêntica.

    mkdir -p C:/workspace/openjdk-build/workspace/build/openjdkbuild
  12. Configurar o build

    Determine e edite os "argumentos de configuração" para corresponder ao seu ambiente local

    1. Determine os argumentos de configuração para este build

      Use o seguinte grep para encontrar os argumentos de configuração necessários no SBOM-metadata.json

      grep "using configure arguments" <SBOM-metadata.json> | sed -n -e "s/^.*using configure arguments '\(.*\)'\..*/\1/p"
    2. Remova -–with-cacerts-src=<path>, pois o Temurin é construído com certificados CA Mozilla, enquanto o build local usará os certificados CA padrão do OpenJDK.

    3. Atualize --with-ucrt-dll-dir=<path>, para garantir que corresponda à localização na sua máquina local, especifique:

      --with-ucrt-dll-dir='C:/Program Files (x86)/Windows Kits/10/Redist/10.0.22621.0/ucrt/DLLs/x64'
    4. Substitua -–with-boot-jdk=<path>, pelo caminho para o boot jdk local descompactado acima.

      Configure a partir do diretório "C:/workspace/openjdk-build/workspace/build/openjdkbuild"

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

    make images

    A imagem construída estará disponível no diretório: /cygdrive/c/workspace/openjdk-build/workspace/build/openjdkbuild/images/jdk

  14. Baixar o lançamento oficial do Eclipse Temurin a ser verificado

    Baixe e descompacte o JDK Temurin a ser verificado:

    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. Baixar e configurar as ferramentas de comparação de build reproduzível do Adoptium temurin-build para Windows

    Devido às "assinaturas de assinatura" do Temurin nos .exe/dll’s do Windows, é necessário um processamento para remover as assinaturas digitais únicas usando a ferramenta signtool.exe do Windows. Para auxiliar nesse processo e realizar a comparação, as ferramentas temurin-build do Adoptium fornecem um script de comparação reproduzível.

    Execute as seguintes etapas para clonar e configurar seu ambiente para executar o script de comparação reproduzível do temurin-build:

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

    • cd temurin-build/tooling

    • Compile BinRepl.java:

      javac src/java/temurin/tools/BinRepl.java
    • Encontre "signtool.exe" e adicione ao PATH, por exemplo:

      export PATH=/cygdrive/c/progra~2/wi3cf2~1/10/bin/10.0.22621.0/x64:$PATH
    • Encontre "dumpbin.exe" e adicione ao PATH, por exemplo:

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

    • Defina CLASSPATH para encontrar o BinRepl.class compilado, por exemplo:

      export CLASSPATH=../src/java
  16. Verificar se a reconstrução local segura é idêntica ao binário oficial do Eclipse Temurin

    Compare a reconstrução local com o JDK oficial do Eclipse Temurin. Este script envolve desempacotar os jmods e remover todas as "Assinaturas" únicas de assinatura do Temurin; este processo leva um tempo para ser concluído (aproximadamente 30 minutos):

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

    Para uma verificação bem-sucedida, o script deve reportar um resultado reproduzível de 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

Ajude-nos a melhorar esta documentação!

Toda a documentação do Adoptium é open source. Viu algo errado ou confuso?

Autores da Documentação
andrew-m-leonardgdams
Join our Slack channel to discuss and reach out to maintainers.Join Slack