156 个版本

0.10.66 2024 年 7 月 21 日
0.10.64 2024 年 2 月 19 日
0.10.62 2023 年 12 月 22 日
0.10.60 2023 年 11 月 23 日
0.2.1 2014 年 11 月 28 日

#4 in 加密学

Download history 942842/week @ 2024-05-03 959929/week @ 2024-05-10 983291/week @ 2024-05-17 966161/week @ 2024-05-24 1034729/week @ 2024-05-31 985427/week @ 2024-06-07 968106/week @ 2024-06-14 975900/week @ 2024-06-21 917969/week @ 2024-06-28 931267/week @ 2024-07-05 996503/week @ 2024-07-12 1096673/week @ 2024-07-19 1068038/week @ 2024-07-26 1047263/week @ 2024-08-02 1156432/week @ 2024-08-09 1142520/week @ 2024-08-16

4,623,934 每月下载量
5,894 个crate (1,238 直接使用) 中使用

Apache-2.0

1.5MB
35K SLoC

rust-openssl

crates.io

Rust 编程语言的 OpenSSL 绑定。

文档.

版本支持

当前支持的 openssl 版本是 0.10,openssl-sys 版本是 0.9。

新的大版本每年最多发布一次。新版本发布后,旧的大版本将在三个月内获得部分支持,以修复错误,之后将完全停止支持。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在作品中的贡献,将根据 Apache 许可证第 2 版和 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 安装。此外,它将在类 Unix 系统上使用 pkg-config 来查找系统安装。

$ 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 版本中可用的功能。这意味着在针对一个 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–1.7MB
~38K SLoC