Build de Verificação Reproduzível do Temurin no Linux aarch64

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 Linux aarch64. O processo é realizado de forma segura, usando apenas as fontes upstream e ferramentas de build verificadas de forma segura, 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

  • Construção do gcc DevKit a partir do "código-fonte" idêntico ao usado pelo Eclipse Adoptium

  • 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

Procedimento de build de verificação reproduzível no Linux aarch64

  1. Ambiente de Build

    Para reconstruir identicamente o Eclipse Temurin no Linux aarch64, é necessário um Centos ou RHEL adequado, de versão 7 ou 8.

  2. Instalar Ferramentas 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. Instalar Ferramentas de Build

    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
  4. Versão do GNU make >= 4?

    O GNU make deve ser pelo menos versão 4 para construir o gcc DevKit.

    Verifique a versão do GNU make

    make --version

    Se não for pelo menos versão 4, baixe e construa o GNU make 4.3 da seguinte forma:

    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. Definir Fuso Horário para UTC

    Para builds idênticos, o fuso horário do build deve ser UTC para garantir saída de build binária exata

    timedatectl set-timezone UTC
  6. Baixar Arquivos de Script make do Adoptium DevKit Toolchain

    Para construir de forma segura e idêntica um gcc DevKit Toolchain, baixe de forma segura os seguintes scripts do repositório Eclipse Adoptium. Esses scripts e patches habilitam o processo de make do DevKit para construir com um sysroot Centos e também permitem o download verificado por GPG dos RPMs Centos para verificação adicional de integridade.

    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. Construir o gcc DevKit Toolchain a partir do código-fonte

    bash ./make_devkit.sh jdk21u aarch64 Centos 7.6.1810

    O "caminho do DevKit" construído estará na pasta jdk21u/build/devkit/result/aarch64-linux-gnu-to-aarch64-linux-gnu

    Defina LD_LIBRARY_PATH para localizar as bibliotecas do DevKit recém-construídas

    export LD_LIBRARY_PATH=<DevKit path>/lib64:<DevKit path>/lib
  8. Baixar o SBOM do build do Eclipse Temurin a ser verificado

    Por exemplo, para baixar o SBOM e os metadados do SBOM para o lançamento jdk-21.0.4+7

    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
  9. 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"

  10. 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 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

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

    Desempacote em uma pasta adequada

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

    Adicione à variável de ambiente PATH

    export PATH=<bootjdk>/bin:$PATH
  11. 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 jdk21u_bld
    # Checkout required tag to build
    (cd jdk21u_bld && git checkout <OpenJDK tag to build>)
  12. Criar um diretório de build local

    mkdir openjdk_build
  13. 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. Substitua -–with-devkit=<path>, pelo caminho para o gcc DevKit local construído "<path>/jdk21u/build/devkit/result/aarch64-linux-gnu-to-aarch64-linux-gnu".

    3. 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.

    4. Substitua -–with-boot-jdk=<path>, pelo caminho para o boot jdk local desempacotado acima.

      Configure a partir do diretório "openjdk_build"

      cd openjdk_build
      bash ../jdk21u_bld/configure <edited configure args>
  14. Construir o Temurin

    make images
  15. Remover a saída de imagem construída que não é relevante para a comparação de build reproduzível

    1. "cacerts" : O Temurin é construído com sua própria lista de certificados CA Mozilla (precisa ser removido de lib/security e java.base/lib/security)

    2. "release" : O arquivo de descrição de texto "release" difere devido ao ambiente de SO de build diferente e metadados adicionais do Temurin

    3. "demo" : O Temurin não distribui os arquivos de exemplo "demo"

    4. "debuginfo" : O tarball do JDK Temurin não contém 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. Baixar o lançamento oficial do Eclipse Temurin para "Verificação"

    Baixe e desempacote o JDK Temurin a ser verificado:

    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
  17. Remover os mesmos arquivos não relevantes

    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. Verificar se a reconstrução local segura é idêntica ao binário oficial do Eclipse Temurin

    Compare as duas imagens

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

    Para uma verificação bem-sucedida não deve haver diferenças.

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