#client-server #server-response #yaml-config #system-time #crypto #roughtime

bin+lib roughenough

用 Rust 编写的 Roughtime 安全时间同步服务器和客户端

22 个版本 (稳定)

1.2.1-draft82024年5月19日
1.2.0-draft52022年4月2日
1.1.8 2020年3月21日
1.1.7 2019年10月12日
0.1.1 2017年12月30日

#132 in 加密学

Download history 81/week @ 2024-05-18 13/week @ 2024-05-25 1/week @ 2024-06-01 67/week @ 2024-07-06

1,366 每月下载量
用于 roughenough-fuzz

Apache-2.0

195KB
3.5K SLoC

Roughenough

crates.io Build Apache License 2

Roughenough 是一个符合 RFC 草案规范,使用 Rust 实现的 Roughtime 安全时间同步客户端和服务器。

Roughenough 的服务器和客户端功能完整,与参考的 C++ 和 Golang 实现功能一致。

需要最新稳定版 Rust 编译。欢迎贡献,参见 CONTRIBUTING 获取说明和 局限性 信息。

RFC 进行中

Roughenough 实现了 草案-8 RFC 中指定的 Roughtime 协议。

与草案 RFC 的重要差异

  1. 服务器和客户端发送/期望的 RFC 协议版本为 1(VER 标签为 0x00000001),而不是草案建议的 0x80000000 + 版本

Roughenough 服务器在同一服务端口上同时运行“经典”协议和 RFC 兼容协议(RFC 添加的 8 字节魔数帧值用于区分经典和 RFC 请求)。

roughenough-client 的新 -p/--protocol 标志控制请求中使用的协议版本(0 = 经典协议,1 = RFC 协议)。默认为 0 “经典”协议,直到 RFC 最终确定。

# send RFC protocol Roughtime requests
$ roughenough-client -p 1 roughtime.int08h.com 2002

构建和运行

最低支持的 Rust 版本 (MSRV)

Roughenough 使用 2021 版本 功能,并需要 Rust 1.72 或更高版本来构建。

构建

# Build roughenough
$ cargo build --release

客户端二进制文件位于 target/release/roughenough-client。构建后,如果您愿意,可以复制二进制文件并单独运行(不需要 cargo)。

$ cp target/release/roughenough-client /usr/local/bin 

使用客户端查询 Roughtime 服务器

$ target/release/roughenough-client -v roughtime.int08h.com 2002
Requesting time from: "roughtime.int08h.com":2002
Received time from server: midpoint="Oct 26 2018 23:20:44", radius=1000000, verified=No (merkle_index=0)
Oct 26 2018 23:20:44

在 Linux 上设置系统时间

您可以使用 Linux 机器上的 date 工具将系统时间设置为 Roughenough 客户端确定的时间。

sudo date --utc --set "$(roughenough-client -z roughtime.int08h.com 2002)"

在 FreeBSD 上设置系统时间

您可以使用 FreeBSD 机器上的 date 工具将系统时间设置为 Roughenough 客户端确定的时间。

sudo date -u "$(roughenough-client -z roughtime.int08h.com 2002 -f %Y%m%d%H%M.%S)"

验证服务器响应

使用客户端的 -p 标志来使用其公钥验证服务器的响应。

# The public key of 'roughtime.int08h.com' is stored in a DNS TXT record 
$ host -t TXT roughtime.int08h.com
roughtime.int08h.com descriptive text "AW5uAoTSTDfG5NfY1bTh08GUnOqlRb+HVhbJ3ODJvsE="

# Validate the server response using its public key
$ target/release/roughenough-client -v roughtime.int08h.com 2002 -k "AW5uAoTSTDfG5NfY1bTh08GUnOqlRb+HVhbJ3ODJvsE="
Requesting time from: "roughtime.int08h.com":2002
Received time from server: midpoint="Oct 26 2018 23:22:20", radius=1000000, verified=Yes (merkle_index=0)
Oct 26 2018 23:22:20

输出中的 verified=Yes 确认服务器的响应有一个有效的签名。

服务器配置

有两种(互斥的)方式来配置 Roughenough 服务器

  1. YAML 文件,或者
  2. 环境变量

服务器接受以下配置参数

YAML 键 环境变量 必要性 描述
interface ROUGHENOUGH_INTERFACE 必需 用于监听客户端请求的 IP 地址或接口名称
port ROUGHENOUGH_PORT 必需 用于监听请求的 UDP 端口
seed ROUGHENOUGH_SEED 必需 用于生成服务器长期密钥对的 32 字节十六进制值。 这是一个秘密值,必须是不可预测的,请谨慎处理。(如果编译了 KMS 支持,长度将变化;请参阅 可选功能
batch_size ROUGHENOUGH_BATCH_SIZE 可选 每批处理的最大请求数量。批处理中的所有 nonce 都用于构建 Merkle 树,该树的根被签名。默认为每批 64 个请求。
status_interval ROUGHENOUGH_STATUS_INTERVAL 可选 每次记录状态更新之间的 秒数。默认为 600 秒(10 分钟)。
health_check_port ROUGHENOUGH_HEALTH_CHECK_PORT 可选 如果存在,在提供的端口上启用 HTTP 健康检查响应者。 请谨慎使用,请参阅 可选功能
kms_protection ROUGHENOUGH_KMS_PROTECTION 可选 如果编译了 KMS 支持,则是用于保护长期身份的 KMS 密钥的 ID。请参阅 可选功能
fault_percentage ROUGHENOUGH_FAULT_PERCENTAGE 可选 服务器有意返回无效客户端响应的可能性(以百分比表示)。一个整数范围从 0(禁用,所有响应都有效)到 50(50% 的响应将无效)。默认值为 0(禁用)。

YAML 配置

上表列出了配置文件中可用的 YAML 键。以下是一个示例

interface: 127.0.0.1
port: 8686
seed: f61075c988feb9cb700a4a6a3291bfbc9cab11b9c9eca8c802468eb38a43d7d3

将配置文件作为 Roughenough 服务器二进制文件的唯一命令行参数提供

$ /path/to/roughenough-server /path/to/config.yaml

环境配置

Roughenough 可以通过上表列出的 ROUGHENOUGH_* 环境变量进行配置。使用单个 ENV 参数启动服务器,让 Roughenough 从环境中配置自身。示例

$ export ROUGHENOUGH_INTERFACE=127.0.0.1
$ export ROUGHENOUGH_PORT=8686
$ export ROUGHENOUGH_SEED=f61075c988feb9cb700a4a6a3291bfbc9cab11b9c9eca8c802468eb38a43d7d3
$ /path/to/roughenough-server ENV

启动服务器

# Build roughenough
$ cargo build --release

# Via a config file
$ target/release/roughenough-server example.cfg
2018-07-25 00:05:09 INFO  [server] Roughenough server v1.0.5 starting
2018-07-25 00:05:09 INFO  [server] Long-term public key: d0756ee69ff5fe96cbcf9273208fec53124b1dd3a24d3910e07c7c54e2473012
2018-07-25 00:05:09 INFO  [server] Ephemeral public key: 25fd5dc31ceee241aed3e643534e95ed0609e9a20982a45ac0312a5f55e2cc66
2018-07-25 00:05:09 INFO  [server] Server listening on 127.0.0.1:8686

# Or using environment variables
$ export ROUGHENOUGH_INTERFACE=127.0.0.1
$ export ROUGHENOUGH_PORT=8686
$ export ROUGHENOUGH_SEED=f61075c988feb9cb700a4a6a3291bfbc9cab11b9c9eca8c802468eb38a43d7d3
$ target/release/roughenough-server ENV
2018-07-25 00:05:09 INFO  [server] Roughenough server v1.0.5 starting
2018-07-25 00:05:09 INFO  [server] Long-term public key: d0756ee69ff5fe96cbcf9273208fec53124b1dd3a24d3910e07c7c54e2473012
2018-07-25 00:05:09 INFO  [server] Ephemeral public key: 25fd5dc31ceee241aed3e643534e95ed0609e9a20982a45ac0312a5f55e2cc66
2018-07-25 00:05:09 INFO  [server] Server listening on 127.0.0.1:8686

生成的二进制文件是 target/release/roughenough-server。构建后,可以复制二进制文件并单独运行(无需 cargo

$ cp target/release/roughenough-server /usr/local/bin 

停止服务器

使用 Ctrl-C 或 kill 终止进程。

可选功能

Roughenough 有两个可选(默认禁用)功能,可以通过配置设置或编译时启用。

有关详细信息和使用说明,请参阅 OPTIONAL-FEATURES.md

限制

服务器未实现 Roughtime 功能

  • 在线(服务器运行时)密钥轮换。必须重新启动服务器才能生成新的委托密钥。
  • Roughenough 服务器依赖于主机的时源以符合 Roughtime 协议的平滑闰秒要求。从 Google 的公共 NTP 服务器 获取时间的 Roughenough 服务器会产生符合要求的平滑闰秒,但来自 pool.ntp.org 的时源可能不会。

关于 Roughtime 协议

Roughtime 是一个旨在以安全方式在不依赖于任何特定时间服务器的情况下实现粗略时间同步的协议,并且如果时间服务器行为不当,客户端最终会得到其加密证明。它由 Adam Langley 和 Robert Obryk 创建。

贡献者

  • Stuart Stock (stuart {at} int08h.com)
  • Aaron Hill (aa1ronham {at} gmail.com)
  • Peter Todd (pete {at} petertodd.org)
  • Muncan90 (github.com/muncan90)
  • Zicklag (github.com/zicklag)
  • Greg at Unrelenting Tech (github.com/unrelentingtech)
  • Eric Swanson (github.com/lachesis)

Roughenough 版权所有(c)2017-2024 int08h LLC。保留所有权利。

int08h LLC 根据 Apache 许可证版本 2.0(“许可证”)向您授予 Roughenough(“软件”)的使用权;您只能在不违反许可证的情况下使用此软件。您可以从包含在软件中的 LICENSE 文件或

https://apache.ac.cn/licenses/LICENSE-2.0 获取许可证副本。

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言、许可和限制,请参阅许可证。

依赖项

~10–24MB
~428K SLoC