22 个版本 (稳定)
1.2.1-draft8 | 2024年5月19日 |
---|---|
1.2.0-draft5 | 2022年4月2日 |
1.1.8 | 2020年3月21日 |
1.1.7 | 2019年10月12日 |
0.1.1 | 2017年12月30日 |
#132 in 加密学
1,366 每月下载量
用于 roughenough-fuzz
195KB
3.5K SLoC
Roughenough
Roughenough 是一个符合 RFC 草案规范,使用 Rust 实现的 Roughtime 安全时间同步客户端和服务器。
Roughenough 的服务器和客户端功能完整,与参考的 C++ 和 Golang 实现功能一致。
需要最新稳定版 Rust 编译。欢迎贡献,参见 CONTRIBUTING 获取说明和 局限性 信息。
RFC 进行中
Roughenough 实现了 草案-8 RFC 中指定的 Roughtime 协议。
与草案 RFC 的重要差异
- 服务器和客户端发送/期望的 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
链接
- Roughenough GitHub 仓库
- 原始的 Roughtime 项目
- 我的博客文章深入探讨了 Roughtime 的技术细节,包括 如何捕捉到欺骗性的时间服务器 和 Roughtime 传输中的消息结构。
- Cloudflare 的出色 博客文章 和相应的 开源项目。
构建和运行
最低支持的 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 服务器
- YAML 文件,或者
- 环境变量
服务器接受以下配置参数
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 有两个可选(默认禁用)功能,可以通过配置设置或编译时启用。
- HTTP 健康检查响应器,以方便检测和替换“生病”的 Roughenough 服务器。
- 密钥管理系统(KMS)支持,使用信封加密和 AWS 或 Google KMS 保护长期服务器身份。
有关详细信息和使用说明,请参阅 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