#repository #update #tuf #signing-key #generate #command-line-tool

app tuftool

用于创建和签名 The Update Framework (TUF) 存储库的工具

23 个版本

0.10.3 2024 年 3 月 15 日
0.10.2 2023 年 12 月 6 日
0.10.1 2023 年 11 月 8 日
0.9.0 2023 年 3 月 3 日
0.1.0 2019 年 11 月 9 日

Web 编程 中排名 591

Download history 152/week @ 2024-03-11 59/week @ 2024-03-18 1/week @ 2024-03-25 84/week @ 2024-04-01 69/week @ 2024-04-08 102/week @ 2024-04-15 38/week @ 2024-04-22 27/week @ 2024-04-29 8/week @ 2024-05-06 296/week @ 2024-05-13 105/week @ 2024-05-20 73/week @ 2024-05-27 67/week @ 2024-06-03 158/week @ 2024-06-10 75/week @ 2024-06-17 25/week @ 2024-06-24

每月下载 328

MIT/Apache

485KB
10K SLoC

tuftool 是一个用于生成和签名 TUF 存储库的 Rust 命令行工具。

依赖关系

在安装 tuftool 之前,请确保您的系统上存在以下依赖项

  • OpenSSL:在 Ubuntu 上安装 libssl-dev,或在 Fedora 上安装 openssl-devel

安装

要安装 tuftool 的最新版本

cargo install --force tuftool

默认情况下,cargo 将二进制文件安装到 ~/.cargo/bin,因此您需要在您的路径中包含此路径。有关安装 Rust 二进制存储库的更多信息,请参阅 cargo 书籍

最小 TUF 仓库

以下是如何使用 tuftool 创建和下载 TUF 仓库的示例。首先,创建一个工作目录

export WRK="${HOME}/tuftool-example"
mkdir -p "${WRK}"

创建 root.json 和签名密钥

对于生产环境,您可能希望使用 AWS KMS 等服务,但在此示例中,我们将创建本地文件作为密钥

# we will store our root.json in $WRK/root
mkdir "${WRK}/root"
# save the path to the root.json we are about to create, we will use it a lot
export ROOT="${WRK}/root/root.json"

# we will store our signing keys in $WRK/keys
mkdir "${WRK}/keys"

# instantiate a new root.json
tuftool root init "${ROOT}"

# set the root file's expiration date
tuftool root expire "${ROOT}" 'in 6 weeks'

# set the signing threshold for each of the standard signing roles. we are saying
# that each of the following roles must have at least 1 valid signature
tuftool root set-threshold "${ROOT}" root 1
tuftool root set-threshold "${ROOT}" snapshot 1
tuftool root set-threshold "${ROOT}" targets 1
tuftool root set-threshold "${ROOT}" timestamp 1

# create an RSA key and store it as a file. this requires openssl on your system
# this command both creates the key and adds it to root.json for the root role
tuftool root gen-rsa-key "${ROOT}" "${WRK}/keys/root.pem" --role root

# for this example we will re-use the same key for the other standard roles
tuftool root add-key "${ROOT}" -k "${WRK}/keys/root.pem" --role snapshot
tuftool root add-key "${ROOT}" -k "${WRK}/keys/root.pem" --role targets
tuftool root add-key "${ROOT}" -k "${WRK}/keys/root.pem" --role timestamp

# sign root.json
tuftool root sign "${ROOT}" -k "${WRK}/keys/root.pem"

创建新的 TUF 仓库

现在我们已经有了 root.json 文件,我们可以创建并签名一个 TUF 仓库。

# create a directory to hold the targets that we will sign. we call this the
# 'input' directory because these are the targets that we want to put into
# our TUF repo
mkdir -p "${WRK}/input"

# create the targets that we want in our TUF repo
echo "1" > "${WRK}/input/1.txt"
echo "2" > "${WRK}/input/2.txt"

# create a tuf repo!
tuftool create \
  --root "${ROOT}" \
  --key "${WRK}/keys/root.pem" \
  --add-targets "${WRK}/input" \
  --targets-expires 'in 3 weeks' \
  --targets-version 1 \
  --snapshot-expires 'in 3 weeks' \
  --snapshot-version 1 \
  --timestamp-expires 'in 1 week' \
  --timestamp-version 1 \
  --outdir "${WRK}/tuf-repo"

# you can see our signed repository's metadata here:
ls "${WRK}/tuf-repo/metadata"
# and you can see our signed repository's targets here:
ls "${WRK}/tuf-repo/targets"

### Update TUF Repo

# Change one of the target files
echo "1.1" > "${WRK}/input/1.txt"

# update tuf repo!
tuftool update \
   --root "${ROOT}" \
   --key "${WRK}/keys/root.pem" \
   --add-targets  "${WRK}/input" \
   --targets-expires 'in 3 weeks' \
   --targets-version 2 \
   --snapshot-expires 'in 3 weeks' \
   --snapshot-version 2 \
   --timestamp-expires 'in 1 week' \
   --timestamp-version 2 \
   --outdir "${WRK}/tuf-repo" \
   --metadata-url file:///$WRK/tuf-repo/metadata

下载 TUF 仓库

现在我们已经创建了 TUF 仓库,我们可以使用下载命令来检查它。通常,下载命令用于通过 HTTP/S URL 下载远程仓库,但在此示例中,我们将使用基于文件的 URL 从本地仓库下载。

# download tuf repo
tuftool download \
   --root "${ROOT}" \
   -t "file://${WRK}/tuf-repo/targets" \
   -m "file://${WRK}/tuf-repo/metadata" \
   "${WRK}/tuf-downlaod"

HTTP 代理支持

tuftool 遵循 HTTPS_PROXYNO_PROXY 环境变量。

容器

您可以构建一个简单的容器镜像,以避免在本地机器上安装 Rust 工具链和依赖项。

使用 Docker 或 Finch 构建镜像(使用相同的参数语法,只需将 docker 替换为 finch

docker build -t tuftool .

要使用 tuftool,将主机工作目录挂载到 /share

例如,要将当前目录挂载为 download,您可能需要执行以下操作:

docker run -it -v $(pwd):/share tuftool download "/share/some_directory" ...

测试

单元测试通常按以下方式运行:cargo test。集成测试需要有效的 AWS 凭证,默认情况下由名为 integ 的功能禁用。要运行所有测试,包括集成测试,请使用以下命令: cargo testAWS_PROFILE=test-profile cargo test --features 'integ' 并指定特定配置文件。

依赖关系

~48–65MB
~1M SLoC