与 CircleCI 的云代码签名集成

本教程展示了 eSigner 如何与 CircleCI 集成以进行自动代码签名。

eSigner 是 SSL.com 的代码签名云环境。 签名密钥和证书由 SSL.com 安全地托管在云中,并且可以从任何连接互联网的设备访问以进行签名,从而使 eSigner 成为企业代码签名的最佳平台之一。 eSigner 工具包包括 CodeSignTool,它是一个 命令行实用程序 EV代码签名 证书,非常适合在包括 CircleCI 在内的各种持续集成/持续交付 (CI/CD) 平台中创建自动签名过程。 

SSL.com的 EV 代码签名 证书通过最高级别的验证帮助保护您的代码免受未经授权的篡改和破坏,并且只需 $ 249每年。 您也可以 大规模使用您的 EV 代码签名证书 使用 eSigner 在云中。

马上订购

环境变量

  • USERNAME: SSL.com 帐户用户名。 (必需的)
  • 密码: SSL.com 帐号密码 (必填)
  • 凭据_ID:用于签署证书的凭据 ID。 如果 credential_id 被省略并且用户只有一个 eSigner 代码签名证书,CodeSignTool 将默认使用该证书。 如果用户拥有多个代码签名证书,则此参数为必填项。 (必需的)
  • TOTP_秘密:OAuth TOTP 秘密。 您可以访问详细信息 https://www.ssl.com/how-to/automate-esigner-ev-code-signing (必填)
  • ENVIRONMENT_NAME :“测试”或“生产”环境。 (必需的)

输入

  • 输入文件路径:要签名的代码对象的路径。 (必需的)
  • 输出目录路径:将写入签名代码对象的目录。 如果省略 output_path,则在 -file_path 中指定的文件将被签名文件覆盖。

准备工作流的组件 (.NET 代码 DLL 签名)

  1. 创建一个 .circleci 文件夹

在您的代码签名工作区中,创建一个 .circleci 文件夹. 在它下面,创建一个 config.yml 文件.

  1. 设置 CI 版本
版本:2.1
 
  1.  通过工作流调用作业。 工作流编排一组要运行的作业。 此管道的作业配置如下

请参见: https://circleci.com/docs/2.0/configuration-reference/#workflows

工作流程:
 
  1. 写下工作流程的名称。
  点网:
 
  1. 在工作流中,您定义要运行的作业。
 工作:-构建-签名:需要:-构建
 

定义构建阶段

  1. 定义稍后在工作流中调用的作业。

 (请参阅:https://circleci.com/docs/2.0/configuration-reference/#jobs)

工作: 建造:

 

  1. 创建环境变量
  • 环境变量用于使示例更具可读性。 在上面示例签名工作流的屏幕截图中,可以选择省略 PROJECT_NAME、PROJECT_VERSION 和 DOTNET_VERSION。 即使有这些遗漏,签名仍然可以继续进行。  
  环境:PROJECT_NAME:HelloWorld PROJECT_VERSION:0.0.1 DOTNET_VERSION:3.1 WORKSPACE:/home/circleci/project

 

  1.  定义一个 Docker 执行器:(https://circleci.com/docs/2.0/executor-types/)

    # 您可以指定来自 Dockerhub 的图像或使用我们来自 CircleCI 开发者中心的便利图像之一。

 码头工人:-图像:mcr.microsoft.com/dotnet/sdk:3.1-bullseye

 

  1. 放置作业的工作目录
  工作目录:/home/circleci/project

 

  1. 向作业添加步骤

    请参阅:https://circleci.com/docs/2.0/configuration-reference/#steps

  脚步:

 

  1.  查看源代码,以便工作流可以访问它。
    - 查看

 

  1. 创建工件目录以存储已签名和未签名的工件文件
    - 运行:名称:创建工件目录命令:| mkdir -p ${WORKSPACE}/artifacts mkdir -p ${WORKSPACE}/packages

 

  1.  构建 dotnet 项目或解决方案及其所有依赖项。
      - 运行:名称:构建 Dotnet 项目命令:dotnet build dotnet/${PROJECT_NAME}.csproj -c Release

 

  1. 将工件复制到工件目录
  • 在这个书面签名示例工作流中,创建了多个项目类型。 这就是为什么通过创建子文件夹来保存不同项目类型的文件的原因。 为 Dotnet 项目创建了一个名为“dotnet”的子文件夹。 在上面的演示屏幕截图中,无需创建名为“dotnet”的子文件夹,因此脚本中未包含该文件夹。
  - 运行:名称:复制工件命令:| cp dotnet/bin/Release/netcoreapp${DOTNET_VERSION}/${PROJECT_NAME}-${PROJECT_VERSION}.dll ${WORKSPACE}/packages/HelloWorld.dll

 

  1. 将工件保存到工件目录以进行签名
  -persist_to_workspace:根:。 路径: - 包/*
 

定义签名阶段

  1. 定义签名作业
 标志:

 

  1. 创建环境变量
  • 在上面的屏幕截图中,sign 命令是直接在 sign 脚本中定义的,而不是在环境变量下。 乙其他方法可以使用 CircleCI 正确签名。
  • 环境变量用于使示例更具可读性。 在上面示例工作流的屏幕截图中,一些变量可以选择不包括在内。 即使有这些遗漏,签名仍然可以继续进行。  
    环境:ENVIRONMENT_NAME:PROD COMMAND:sign WORKSPACE:/home/circleci/project

 

  1.     将作业的工作目录放在 Circle-CI 上
 工作目录:/home/circleci/project

 

  1. 用于签名的工件名称
  • 'artifact-name' 值是多个项目的一个选项 添加了 'artifact-name' 参数,以便可以将相同的签名部分用于所有项目类型。 由于屏幕截图中的示例基于单个项目,因此没有必要包含它。
    参数:工件名称:类型:字符串默认值:''

 

  1. 定义一个 docker 执行器:

 有关其他参考,请参阅: https://circleci.com/docs/2.0/executor-types/

       您可以指定来自 Dockerhub 的图像,也可以使用我们来自 CircleCI 开发者中心的便利图像之一。

       请务必将下面的 Docker 映像标记更新为应用程序的 openjdk 版本。

       此处提供了可用的 CircleCI Docker 便利镜像列表: https://circleci.com/developer/images/image/cimg/openjdk

   码头工人:- 图像:cimg/openjdk:17.0.3

 

  1. 向作业添加步骤

      有关其他参考,请参阅: https://circleci.com/docs/2.0/configuration-reference/#steps

    脚步:

 

  1. 创建工件目录以存储已签名和未签名的工件文件
  - 运行:名称:创建工件目录命令:| mkdir -p ${WORKSPACE}/artifacts mkdir -p ${WORKSPACE}/packages

 

  1. 附加到工作区以访问工件文件
   - attach_workspace:在:/home/circleci/project

 

  1. 在 Circle-CI 上为 CodeSigner 启用 Docker
 - setup_remote_docker:名称:设置远程 Docker 版本:19.03.13 docker_layer_caching:true

 

  1. 从 Github Registry 中拉取 Codesigner Docker 镜像
        - 运行:名称:Docker Pull Image 命令:| docker pull ghcr.io/sslcom/codesigner:最新的docker pull alpine:3.4

 

  1. 编写将使用 CodeSignTool 对工件进行签名的步骤。
 - 运行:名称:签署工件文件命令:| docker create -v /codesign-in alpine:3.4 /bin/true docker create -v /codesign/artifacts --name codesign-out alpine:3.4 /bin/true docker cp ${WORKSPACE}/packages /<< parameters.artifact-name >> codesign-in:/codesign/packages docker run -i --rm --dns 8.8.8.8 --network host --volumes-from codesign-in --volumes-from codesign- out -e USERNAME=${USERNAME} -e PASSWORD=${PASSWORD} -e CREDENTIAL_ID=${CREDENTIAL_ID} -e TOTP_SECRET=${TOTP_SECRET} -e ENVIRONMENT_NAME=${ENVIRONMENT_NAME} ghcr.io/sslcom/codesigner:latest ${COMMAND} -input_file_path=/codesign/packages/<< parameters.artifact-name >> -output_dir_path=/codesign/artifacts docker cp codesign-out:/codesign/artifacts/<< parameters.artifact-name >> ${ WORKSPACE}/artifacts/<< parameters.artifact-name >>

 

  1. 编写从工作流中上传工件的步骤,允许您在工作流之间共享数据并在工作流完成后存储数据
    - store_artifacts:名称:上传签名文件路径:/home/circleci/project/artifacts/<<parameters.artifact-name>>目的地:<<parameters.artifact-name>>
 

在命令行上创建一个新的存储库

从您的 GitHub 帐户上的项目位置复制推送命令组件

在您的编辑器中包含所有推送命令组件

SSL.com的 EV 代码签名 证书通过最高级别的验证帮助保护您的代码免受未经授权的篡改和破坏,并且只需 $ 249每年。 您也可以 大规模使用您的 EV 代码签名证书 使用 eSigner 在云中。

马上订购

使用集成到 GitHub 的存储库在 CircleCI 上设置项目

定义所有环境变量

在项目运行时,单击项目设置按钮,然后单击环境变量以定义变量

放置每个变量的值

点击 添加环境变量 按钮添加项目所需的所有变量的名称和值。

等待项目建好

单击持久化到工作区

短暂等待工作空间存档成功上传。

点击签名按钮

等待远程 Docker 设置完成

可能需要一分钟以上,具体取决于文件的大小

等待工件被签名

点击 文物 标签

如果你点击 文物,您将能够看到您已成功进行代码签名的文件。 CircleCI 还将通知您代码签名成功。

您可以参考 SSL.com Github 存储库,其中包含 docker 镜像的源代码并描述了如何使用它:https://github.com/SSLcom/ci-images

示例 CircleCI 管道

查看我们创建的示例 CircleCI 管道 github.com/SSLcom/codesigner-circleci-sample

其他 CI/CD 远程签名集成指南

需要定制解决方案? 

凭借我们的专业知识和五星级支持人员,我们已准备好并愿意与您合作制定定制解决方案或企业级大批量签约折扣。 填写下面的表格,我们会与您联系。

订阅 SSL.com 的时事通讯

不要错过SSL.com上的新文章和更新

保持信息灵通和安全

SSL.com 是网络安全领域的全球领导者, PKI 和数字证书。注册以接收最新的行业新闻、提示和产品公告 SSL.com.

我们希望收到您的反馈

参加我们的调查,让我们知道您对最近购买的想法。