#tls #dtls #api-bindings #crypto

variant-ssl

为BoringSSL / AWS-LC / Tongsuo等OpenSSL变体提供绑定

25个发布版本

0.14.10 2024年7月22日
0.14.7 2024年6月21日
0.14.2 2024年3月20日

480密码学 中排名

Download history 2832/week @ 2024-05-04 3317/week @ 2024-05-11 1077/week @ 2024-05-18 634/week @ 2024-05-25 2044/week @ 2024-06-01 1578/week @ 2024-06-08 2321/week @ 2024-06-15 1965/week @ 2024-06-22 1736/week @ 2024-06-29 2047/week @ 2024-07-06 1959/week @ 2024-07-13 3325/week @ 2024-07-20 1715/week @ 2024-07-27 2415/week @ 2024-08-03 2927/week @ 2024-08-10 3479/week @ 2024-08-17

每月下载量 11,020

Apache-2.0

1.5MB
36K SLoC

variant-ssl

基于rust-openssl的Rust绑定,用于OpenSSL变体,如BoringSSL / AWS-LC / Tongsuo。

文档.

发布支持

当前支持的 variant-ssl 版本是 0.11,而 variant-ssl-sys 是 0.10。

我们将从 rust-openssl 拉取更改。

贡献

请首先将更改发送到 rust-openssl,然后在我们合并后将其拉取。

如果被拒绝或忽略(例如,Tongsuo / AWS-LC特定),您可以在本仓库提交PR。

除非您明确表示,否则根据Apache-2.0许可证定义的任何有意提交以包含在您的工作中的贡献,将根据Apache许可证版本2.0和MIT许可证的双重许可,而无需任何附加条款或条件。


lib.rs:

OpenSSL绑定

此crate提供了一种安全接口,用于流行的OpenSSL加密库。支持OpenSSL版本1.0.1至3.x.x以及LibreSSL版本2.5至3.7.x。

构建

构建此crate需要OpenSSL库和头文件。有多种方法可以定位OpenSSL。

供应商

如果启用了vendored Cargo功能,将使用openssl-src crate编译并静态链接到OpenSSL的副本。构建过程需要C编译器、perl(以及perl-core)和make。OpenSSL版本通常跟踪最新的OpenSSL发布,版本更改不被视为破坏性更改。

[dependencies]
openssl = { version = "0.10", features = ["vendored"] }

供应商副本将被配置为自动在/usr/local/ssl查找配置和根证书。此路径可以通过环境变量覆盖(见以下手册部分)。或者,可以使用openssl-probe crate在运行时查找根证书。

自动

openssl-sys crate将自动检测macOS上的Homebrew和Windows上的vcpkg上的OpenSSL安装。此外,它将使用pkg-config在类Unix系统上查找系统安装。

$ brew install openssl@3

$ sudo port install openssl

$ sudo pkgin install openssl

$ sudo pacman -S pkgconf openssl

$ sudo apt-get install pkg-config libssl-dev

$ sudo dnf install pkgconf perl-FindBin perl-IPC-Cmd openssl-devel

$ apk add pkgconf openssl-dev

$ sudo zypper in libopenssl-devel

手动

可以使用一组环境变量来指向openssl-sys指向OpenSSL安装。它们将覆盖自动检测逻辑。

  • OPENSSL_DIR - 如果指定,则为 OpenSSL 安装目录。该目录应包含 libinclude 子目录,分别包含库和头文件。
  • OPENSSL_LIB_DIROPENSSL_INCLUDE_DIR - 如果指定,则为包含 OpenSSL 库和头文件的目录。如果 OpenSSL 安装在非标准目录布局中,可以使用此设置。
  • OPENSSL_STATIC - 如果设置,则 crate 将与 OpenSSL 静态链接,而不是动态链接。
  • OPENSSL_LIBS - 如果设置,则为要链接的库名称的 : 分隔列表(例如,ssl:crypto)。如果由于某种原因使用了非标准库名称,则可以使用此设置。
  • OPENSSL_NO_VENDOR - 如果设置,即使在启用了 vendored 功能的情况下,也始终在系统中查找 OpenSSL。

如果启用了 vendored Cargo 功能,还可以使用以下环境变量进一步配置 OpenSSL 构建。

  • OPENSSL_CONFIG_DIR - 如果设置,则由 openssl-src crate 构建的 OpenSSL 将配置为在此目录中查找配置文件和根证书。

此外,这些变量可以以大写目标架构(例如,X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR)为前缀,这在交叉编译时可能很有用。

功能检测

各种支持的 OpenSSL 版本中已添加和删除了 API,此库公开了正在链接的版本的可用功能。这意味着当针对一个 OpenSSL 版本构建时,方法、常量甚至模块都存在,而当针对另一个版本构建时则不存在!API 将记录任何版本特定的可用性限制。

如果需要,可以在编译时使用构建脚本来检测 OpenSSL 或 LibreSSL 版本。通过 openssl-sys crate,通过 DEP_OPENSSL_VERSION_NUMBERDEP_OPENSSL_LIBRESSL_VERSION_NUMBER 环境变量将版本传递给构建脚本。版本格式是 OpenSSL 发布版本的十六进制编码:0xMNNFFPPS。例如,版本 1.0.2g 的编码是 0x1_00_02_07_0

例如,假设我们想调整客户端使用的 TLSv1.3 加密套件,但又想编译不支持 TLSv1.3 的 OpenSSL 版本

Cargo.toml

[dependencies]
openssl-sys = "0.9"
openssl = "0.10"

build.rs

use std::env;

fn main() {
    if let Ok(v) = env::var("DEP_OPENSSL_VERSION_NUMBER") {
        let version = u64::from_str_radix(&v, 16).unwrap();

        if version >= 0x1_01_01_00_0 {
            println!("cargo:rustc-cfg=openssl111");
        }
    }
}

lib.rs

use openssl::ssl::{SslConnector, SslMethod};

let mut ctx = SslConnector::builder(SslMethod::tls()).unwrap();

// set_ciphersuites was added in OpenSSL 1.1.1, so we can only call it when linking against that version
#[cfg(openssl111)]
ctx.set_ciphersuites("TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256").unwrap();

依赖关系

~0.4–11MB
~320K SLoC