#tls #rustls #certificate #tls-server #client #modern #ring

rustls-fork-shadow-tls

Rustls 是用 Rust 编写的现代 TLS 库

3 个版本

0.20.9-mod.22023年2月12日
0.20.8 2023年2月11日

#1447 in 密码学

每月下载量 43
用于 3 crates

MIT/Apache/ISC

1MB
19K SLoC

Rustls 是用 Rust 编写的现代 TLS 库。它使用 ring 进行加密和 webpki 进行证书验证。

状态

Rustls 已准备好使用。在 0.20 版本中包含的集合之后,没有预见任何重大的接口变更。

如果您想帮忙,请参阅 CONTRIBUTING.md

Build Status Coverage Status (codecov.io) Documentation Chat

发行历史

  • 下一个版本
    • 计划:移除链接时未使用的签名验证方案。
  • 0.20.8 (2023-01-12)
    • 如果缓冲区已满,从 ConnectionCommon::read_tls() 返回错误。现在,一个完整的解帧器缓冲区和一个完整的输入明文缓冲区都会导致返回错误。调用者应在每次成功调用 read_tls() 后调用 process_new_packets() 并从 reader() 中读取明文数据。
    • 由于某些依赖项需要它,现在最低支持的 Rust 版本是 1.57.0。
  • 0.20.7 (2022-10-18)
    • secret_extraction cargo 功能下公开秘密提取 API。这旨在在成功完成 TLS 1.2/1.3 握手后,例如从 rustls 切换到 kTLS (内核 TLS 转发)。
    • 在配置选择之后移动签名方案的过滤,避免在 ClientHello 中公开更多签名方案的成本下,需要链接加密/解密代码以用于所有加密套件。
    • 将 AlertDescription、ContentType、HandshakeType、SignatureAlgorithm 和 NamedGroup 作为稳定 API 的一部分公开。以前它们是不稳定内部 API 的一部分,但现在它们被稳定 API 的某些部分引用。
    • 我们现在有一个 Discord 频道 用于社区讨论。
    • 由于多个依赖项需要它,现在最低支持的 Rust 版本是 1.56.0。
  • 0.20.6 (2022-05-18)
    • 0.20.5 包含了对 Error::CorruptMessage 更多上下文跟踪的更改,这导致对 Error 类型的 API 不兼容更改。我们已经撤回了 0.20.5,并将其作为 0.20.6 的一部分进行了回滚。
  • 0.20.5 (2022-05-14)
    • 与返回无 TLS 扩展并利用特殊情况编码的服务器保持正确的兼容性。
    • 删除在 0.20.3 中引入的虚假 warn-level 日志。
    • ClientHello 类型中公开 cipher suites。
    • 启用 dangerous_config 时允许验证 IP 地址。
    • ConnectionCommon::complete_io() 中断时重试 I/O 操作。
    • 修复了 server::ResolvesServerCertUsingSni 的大小写敏感问题。
  • 0.20.4 (2022-02-19)
    • 修复了 QUIC 0-RTT 支持的回归。
  • 0.20.3 (2022-02-13)
    • 支持以 SEC1 格式加载 ECDSA 密钥。
    • 支持在 TLS1.3 服务器中接收 0-RTT "early data"。默认情况下未启用;通过将 ServerConfig::max_early_data_size 设置为非零值来启用。
    • 支持在第一次服务器飞行中发送数据。默认情况下也不启用;通过设置 ServerConfig::send_half_rtt_data 来启用。
    • 在编译为夜间版本时支持 read_buf 接口。这意味着可以在不初始化缓冲区的情况下安全地从 rustls 连接读取数据到缓冲区。将 read_buf 功能设置为使用此功能。
    • 在写入 TLS 类型向量时提高效率。
    • 在 TLS1.2 握手过程中减少复制并提高效率。
  • 0.20.2 (2021-11-21)
    • 修复了 CipherSuite::as_str() 值(如 0.20.1 中引入)。
  • 0.20.1 (2021-11-14)
    • 允许将 cipher suite 枚举项转换为字符串。
    • 改进配置构建器类型的文档。
    • 确保在链接时可以删除未使用的 cipher suites。
    • 确保单次使用的错误类型实现 std::error::Error,并且是公共的。

有关变更历史,请参阅 RELEASE_NOTES.md

文档

在此处: https://docs.rs/rustls/

方法

Rustls 是一个旨在提供良好加密安全性的 TLS 库,无需配置即可实现该安全性,并且不提供不安全功能或过时的加密。

当前功能

  • TLS1.2 和 TLS1.3。
  • 客户端通过 ECDSA、Ed25519 或 RSA 进行服务器身份验证。
  • 服务器通过 ECDSA、Ed25519 或 RSA 进行服务器身份验证。
  • 使用 ECDHE 实现前向安全性;使用 curve25519、nistp256 或 nistp384 曲线。
  • AES128-GCM 和 AES256-GCM 批量加密,使用安全的非初始值。
  • ChaCha20-Poly1305 批量加密(RFC7905)。
  • ALPN 支持。
  • SNI 支持。
  • 可调分片大小,使 TLS 消息与底层传输的大小匹配。
  • 可选使用矢量 IO 以最小化系统调用。
  • TLS1.2 会话恢复。
  • 通过票据(RFC5077)进行 TLS1.2 恢复。
  • 通过票据或会话存储进行 TLS1.3 恢复。
  • TLS1.3 0-RTT 数据供客户端使用。
  • TLS1.3 0-RTT 数据供服务器使用。
  • 客户端通过客户端进行身份验证。
  • 服务器通过服务器进行身份验证。
  • 扩展主密钥支持(RFC7627)。
  • 导出器(RFC5705)。
  • 服务器通过 OCSP 粘贴。
  • 服务器通过 SCT 粘贴。
  • 客户端通过 SCT 验证。

可能未来的功能

  • PSK 支持。
  • 客户端通过 OCSP 验证。
  • 证书固定。

非功能

由于手册中有解释的原因(请参阅手册),rustls不提供也不将提供以下功能:

  • SSL1、SSL2、SSL3、TLS1或TLS1.1。
  • RC4。
  • DES或三重DES。
  • 出口加密套件。
  • MAC后加密加密套件。
  • 无前向安全的加密套件。
  • 重新协商。
  • Kerberos。
  • 压缩。
  • 离散对数Diffie-Hellman。
  • 自动协议版本降级。

如果您需要这些功能,有许多其他库可以提供这些功能。

平台支持

Rustls使用ring来实现TLS中的加密。因此,rustls仅在ring支持的平台上运行。在撰写本文时,这意味着x86、x86-64、armv7和aarch64。

Rustls需要Rust 1.56或更高版本。

示例代码

有两个示例程序,它们使用mio进行异步IO。

客户端示例程序

客户端示例程序的名称为tlsclient-mio。界面看起来像

Connects to the TLS server at hostname:PORT.  The default PORT
is 443.  By default, this reads a request from stdin (to EOF)
before making the connection.  --http replaces this with a
basic HTTP GET request for /.

If --cafile is not supplied, a built-in set of CA certificates
are used from the webpki-roots crate.

Usage:
  tlsclient-mio [options] [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] <hostname>
  tlsclient-mio (--version | -v)
  tlsclient-mio (--help | -h)

Options:
    -p, --port PORT     Connect to PORT [default: 443].
    --http              Send a basic HTTP GET request for /.
    --cafile CAFILE     Read root certificates from CAFILE.
    --auth-key KEY      Read client authentication key from KEY.
    --auth-certs CERTS  Read client authentication certificates from CERTS.
                        CERTS must match up with KEY.
    --protover VERSION  Disable default TLS version list, and use
                        VERSION instead.  May be used multiple times.
    --suite SUITE       Disable default cipher suite list, and use
                        SUITE instead.  May be used multiple times.
    --proto PROTOCOL    Send ALPN extension containing PROTOCOL.
                        May be used multiple times to offer several protocols.
    --cache CACHE       Save session cache to file CACHE.
    --no-tickets        Disable session ticket support.
    --no-sni            Disable server name indication support.
    --insecure          Disable certificate verification.
    --verbose           Emit log output.
    --max-frag-size M   Limit outgoing messages to M bytes.
    --version, -v       Show tool version.
    --help, -h          Show this screen.

一些示例运行

$ cargo run --bin tlsclient-mio -- --http mozilla-modern.badssl.com
HTTP/1.1 200 OK
Server: nginx/1.6.2 (Ubuntu)
Date: Wed, 01 Jun 2016 18:44:00 GMT
Content-Type: text/html
Content-Length: 644
(...)

$ cargo run --bin tlsclient-mio -- --http expired.badssl.com
TLS error: WebPkiError(CertExpired, ValidateServerCert)
Connection closed

服务器示例程序

服务器示例程序的名称为tlsserver-mio。界面看起来像

Runs a TLS server on :PORT.  The default PORT is 443.

`echo' mode means the server echoes received data on each connection.

`http' mode means the server blindly sends a HTTP response on each
connection.

`forward' means the server forwards plaintext to a connection made to
localhost:fport.

`--certs' names the full certificate chain, `--key' provides the
RSA private key.

Usage:
  tlsserver-mio --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] [options] echo
  tlsserver-mio --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] [options] http
  tlsserver-mio --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] [options] forward <fport>
  tlsserver-mio (--version | -v)
  tlsserver-mio (--help | -h)

Options:
    -p, --port PORT     Listen on PORT [default: 443].
    --certs CERTFILE    Read server certificates from CERTFILE.
                        This should contain PEM-format certificates
                        in the right order (the first certificate should
                        certify KEYFILE, the last should be a root CA).
    --key KEYFILE       Read private key from KEYFILE.  This should be a RSA
                        private key or PKCS8-encoded private key, in PEM format.
    --ocsp OCSPFILE     Read DER-encoded OCSP response from OCSPFILE and staple
                        to certificate.  Optional.
    --auth CERTFILE     Enable client authentication, and accept certificates
                        signed by those roots provided in CERTFILE.
    --require-auth      Send a fatal alert if the client does not complete client
                        authentication.
    --resumption        Support session resumption.
    --tickets           Support tickets.
    --protover VERSION  Disable default TLS version list, and use
                        VERSION instead.  May be used multiple times.
    --suite SUITE       Disable default cipher suite list, and use
                        SUITE instead.  May be used multiple times.
    --proto PROTOCOL    Negotiate PROTOCOL using ALPN.
                        May be used multiple times.
    --verbose           Emit log output.
    --version, -v       Show tool version.
    --help, -h          Show this screen.

这里是一个示例运行;我们启动一个TLS回显服务器,然后使用openssltlsclient-mio连接到它

$ cargo run --bin tlsserver-mio -- --certs test-ca/rsa/end.fullchain --key test-ca/rsa/end.rsa -p 8443 echo &
$ echo hello world | openssl s_client -ign_eof -quiet -connect localhost:8443
depth=2 CN = ponytown RSA CA
verify error:num=19:self signed certificate in certificate chain
hello world
^C
$ echo hello world | cargo run --bin tlsclient-mio -- --cafile test-ca/rsa/ca.cert -p 8443 localhost
hello world
^C

许可证

Rustls按照以下三个许可证进行分发:

  • Apache License版本2.0。
  • MIT许可证。
  • ISC许可证。

这些分别包含为LICENSE-APACHE、LICENSE-MIT和LICENSE-ISC。您可以选择这些许可证中的任何一个来使用此软件。

行为准则

本项目采用Rust行为准则。有关不当行为的报告,或对行为准则有任何评论或问题,请发邮件至[email protected]

依赖关系

~6–15MB
~268K SLoC