Assured OSS 制品签名概览

有保障的开源软件为您提供软件包、软件包元数据和实用脚本。每个 Assured OSS 软件包都使用单独的 Google 颁发证书进行签名,该证书使用 ECDSA P256 算法生成密钥。每个软件包元数据和实用程序脚本也使用由 Google 签发的单个证书进行签名,该证书使用 ECDSA P256 算法生成密钥。这些证书是使用 Certificate Authority Service 颁发的,相应的公共根证书可在 Cloud Storage 存储桶中找到。

本文档适用于免费层级。如需了解高级层级中的签名,请参阅访问安全元数据并验证软件包

签名概览

签名存储在 signature.zip 文件中。signature.zip 文件包含以下文件:

  • digest.txt:此文件以十六进制编码格式存储哈希算法以及软件包摘要。请参阅以下示例:

    SHA-256:c5feab6f4de0878e94cf2a3074039b4f16a0c93a03501f047ee6eea29a8e33e0`.
    
  • signature.txt:此文件存储签名算法以及以十六进制编码的签名。请参阅以下示例:

    ECDSAP256_DER:30450220585d2a01f20de98dfe6cfab2c01a8f11787dbafbc6541304d23cc582e61be016022100f05a19f5ce473144579dfefc47905fd650584a1c7a31bd9d5bf93ecce739a7cb`
    
  • cert.pem:此文件存储公共证书。

  • certChain.pem:此文件存储公共证书的证书链。

验证签名

您可以使用以下任一方法验证签名:

使用 aoss-verifier 工具验证签名

  1. 如需验证开源软件包的真实性和完整性,请安装 aoss-verifier 工具。

  2. 如需验证软件包,请使用 --language--package_id--version--artifact_path 标志传递 LANGUAGEPACKAGE_IDVERSION 值以及要验证的 PATH_TO_DATA_FILE

    aoss-verifier verify-package \
       --language LANGUAGE \
       --package_id PACKAGE_ID \
       --version VERSION \
       --artifact_path ARTIFACT_PATH
    

    替换以下内容:

    • LANGUAGE:软件包语言。值必须采用小写字母。
    • PACKAGE_ID:对于 Java,格式为 groupId:artifactId。对于 Python,格式为 packageName。值必须采用小写字母。
    • VERSION:软件包的版本。
    • ARTIFACT_PATH:您要验证的本地目录中的数据文件的路径。使用以下文件扩展名:
      • Java 软件包的 jar 文件扩展名
      • Python 软件包的 whl 文件扩展名

手动验证签名

如需手动验证签名,请执行以下操作:

  1. 安装 Google Cloud CLI 和 OpenSSL 软件(版本 3.0.1 或更高版本)。

  2. 验证摘要。

    1. 确定哈希算法。digest.txt 文件包含用于计算摘要的哈希算法。使用以下命令确定哈希算法:

      cut -d ':' -f1 digest.txt
      

      确保输出为 SHA256

    2. 计算数据文件的摘要。您可以根据所用的哈希算法,使用各种命令行工具计算数据文件的摘要。对于有保证的 OSS 数据文件和脚本,请使用 SHA-256 哈希算法生成摘要。

      在 Linux 上,使用以下命令计算哈希:

      sha256sum PATH_TO_DATA_FILE | cut -d ' ' -f1 > datadigest.txt
      

      对于软件包验证,请将 PATH_TO_DATA_FILE 替换为本地目录中用于软件包验证的软件包路径。

      对于元数据验证,请将 PATH_TO_DATA_FILE 替换为元数据文件名。例如 buildInfo.jsonvexInfo.jsonhealthInfo.json

      在 macOS 上,使用以下命令:

      shasum -a 256 PATH_TO_DATA_FILE | cut -d ' ' -f1 > datadigest.txt
      
    3. 使用以下命令从 digest.txt 文件中提取哈希:

      cut -d ':' -f2 digest.txt > signaturedigest.txt
      
    4. 使用以下命令比较这两个摘要:

      diff datadigest.txt signaturedigest.txt
      

      如果没有差异,则不会有输出。

  3. 验证签名

    1. 使用以下命令从 cert.pem 获取公钥:

      openssl x509 -pubkey -noout -in cert.pem  > pubkey.pem
      
    2. 使用以下命令提取二进制格式的签名(如果 xxd 命令不存在,请安装该命令):

      cut -d ':' -f2 signature.txt | xxd -r -p > sig.sig
      
    3. 使用以下命令提取二进制格式的摘要:

      cut -d ':' -f2 digest.txt | xxd -r -p > digest.bin
      
    4. 使用以下命令之一验证签名:

      选项 1

      openssl pkeyutl -in digest.bin -inkey pubkey.pem -pubin -verify -sigfile sig.sig
      

      该命令返回以下输出:

      Signature Verified Successfully

      选项 2

      openssl dgst -sha256 -verify pubkey.pem -signature sig.sig PATH_TO_DATA_FILE
      

      PATH_TO_DATA_FILE 替换为本地目录中数据文件的路径。

      该命令返回以下输出:

      Verified OK

  4. 验证证书

    如需验证证书,请运行以下命令:

    openssl verify -verbose -CAfile ca.crt -untrusted certChain.pem cert.pem
    

    ca.cert 是可以使用以下命令下载的根证书:

    curl -o PATH_TO_LOCAL_STORE https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    

    成功后,系统会返回以下输出:

    cert.pem: OK

使用脚本验证签名

如需使用验证脚本来验证签名,请按以下步骤操作:

  1. 下载验证脚本。

    1. 使用应用默认凭据 (ADC) 设置身份验证

    2. 使用以下命令下载验证脚本所需的 signatureverification.shREADME.mdsignature.zip

      gcloud storage cp "gs://cloud-aoss/utils/signature-verification/v1.0" PATH_TO_LOCAL_STORE --recursive
      

      PATH_TO_LOCAL_STORE 替换为您要下载文件的本地路径。

      您还可以使用验证脚本执行实用程序脚本验证

  2. 按照以下步骤执行脚本:

    1. 安装 Google Cloud CLI 和 OpenSSL 软件(版本 3.0.1 或更高版本)。

    2. 使用有权访问 Assured OSS 的服务账号进行身份验证。

    3. 使用以下命令授予执行脚本所需的权限:

      chmod +x signatureverification.sh
      
    4. 如果您尚未下载 signature.zip 文件,请使用以下命令执行脚本:

      ./signatureverification.sh --data_file_path PATH_TO_DATA_FILE \
      --signature_url SIGNATURE_ZIP_URL \
      --root_cert_url ROOT_CERT_URL
      

      替换以下内容:

      • PATH_TO_DATA_FILE:您要验证的本地目录中数据文件的路径
      • SIGNATURE_ZIP_URL:签名 zip 文件的网址
      • ROOT_CERT_URL:公共根证书网址

输出示例

以下输出表明验证脚本已成功运行。

Signature verification successful

Certificate verification successful

后续步骤