1 个不稳定版本
0.1.0 | 2023年4月16日 |
---|
#2410 in 密码学
在 2 个 crate 中使用 (通过 native-tls-gmssl)
1.5MB
33K SLoC
rust-gmssl
为 Rust 编程语言提供的 GmSSL 绑定。
文档.
发布支持
当前支持的 gmssl
版本为 0.1,gmssl-sys
也是 0.1。
构建 & 测试
仅支持 GmSSL 3.1.0+,编译前必须设置环境变量 DEP_OPENSSL_VERSION_NUMBER。
export DEP_OPENSSL_VERSION_NUMBER=806354944
cargo build
cargo test -- --nocapture
贡献
除非您明确声明,否则您提交的任何旨在包含在作品中的贡献(根据 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"] }
供应商副本将不会配置为自动找到系统的根证书,但可以使用 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 pkg-config openssl
$ sudo apt-get install pkg-config libssl-dev
$ sudo dnf install pkg-config openssl-devel
$ apk add pkgconfig openssl-dev
手动
可以使用一系列环境变量来指向 openssl-sys
的 OpenSSL 安装。它们将覆盖自动检测逻辑。
OPENSSL_DIR
- 如果指定,则 OpenSSL 安装的目录。该目录应包含lib
和include
子目录,分别包含库和头文件。OPENSSL_LIB_DIR
和OPENSSL_INCLUDE_DIR
- 如果指定,则分别包含 OpenSSL 库和头文件的目录。如果 OpenSSL 安装在非标准目录布局中,则可以使用此选项。OPENSSL_STATIC
- 如果设置,则将 crate 静态链接到 OpenSSL 而不是动态链接。OPENSSL_LIBS
- 如果设置,则表示一个以冒号分隔的库名列表,用于链接(例如ssl:crypto
)。在因某种原因使用非标准库名时可以使用此功能。OPENSSL_NO_VENDOR
- 如果设置,则即使启用了vendored
功能,也始终在系统中查找 OpenSSL。
此外,这些变量可以以大写的目标架构(例如 X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
)为前缀,这在交叉编译时可能很有用。
特性检测
各个支持的 OpenSSL 版本中添加和删除了 API,并且这个库暴露了正在链接的版本中可用的功能。这意味着当针对一个 OpenSSL 版本构建时,方法、常量甚至模块都将存在,而当针对另一个版本构建时则不会存在!API 将记录任何特定版本的可访问性限制。
如果需要,可以在编译时使用构建脚本来检测 OpenSSL 或 LibreSSL 的版本。通过 openssl-sys
crate,版本通过 DEP_OPENSSL_VERSION_NUMBER
和 DEP_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 gmssl::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.3MB
~28K SLoC