如何在 Windows 开发环境中使用 OpenSSL for Rust

Sam*_* G. 8 windows openssl rust rust-cargo visual-studio-code

在我的货物文件中添加 SSL 依赖项时,我无法构建我的 Rust 项目。这对 Windows 来说并不陌生,但我想解决这个问题,以便我可以使用 Powershell 和本机 Windows 开发来处理我的 Rust 项目。

有问题的依赖如下:

[dependencies.ws]
version = "0.8.0"
features = ["ssl"]
Run Code Online (Sandbox Code Playgroud)

当我运行 时cargo build,我在 Windows 上遇到很多关于 SSL 的错误,所以让我们开始逐步调试。

第一个错误:

PS C:\Users\sam\vcs\project> cargo build
   Compiling openssl-sys v0.9.43
error: failed to run custom build command for `openssl-sys v0.9.43`
process didn't exit successfully: `C:\Users\sam\vcs\project\target\debug\build\openssl-sys-d964f46e4c48d206\build-script-main` (exit code: 101)
--- stdout
cargo:rustc-cfg=const_fn
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_LIB_DIR
X86_64_PC_WINDOWS_MSVC_OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_INCLUDE_DIR
X86_64_PC_WINDOWS_MSVC_OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_DIR
X86_64_PC_WINDOWS_MSVC_OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_DIR
OPENSSL_DIR unset
note: vcpkg did not find openssl as libcrypto and libssl: Aborted because VCPKGRS_DYNAMIC is not set
note: vcpkg did not find openssl as ssleay32 and libeay32: Aborted because VCPKGRS_DYNAMIC is not set
Run Code Online (Sandbox Code Playgroud)

好的,让我们设置OPENSSL_LIB_DIR, OPENSSL_INCLUDE_DIR, 和OPENSSL_DIR

$env:OPENSSL_LIB_DIR="C:\OpenSSL-Win64\lib"
$env:OPENSSL_INCLUDE_DIR="C:\OpenSSL-Win64\include"
$env:OPENSSL_DIR="C:\OpenSSL-Win64"
Run Code Online (Sandbox Code Playgroud)

但是,现在正在运行cargo buildcargo run实际编译,但我认为 SSL 不能正常工作,因为连接到 websocket 的代码路径失败并显示无错误。

我从以下网站安装了最新 (1.1.0j) 完整(非超薄)版本的 OpenSSL:https ://slproweb.com/products/Win32OpenSSL.html

它设置的唯一环境变量是:

OPENSSL_CONF: C:\OpenSSL-Win64\bin\openssl.cfg
Run Code Online (Sandbox Code Playgroud)

但我也添加C:\OpenSSL-Win64\bin到我的PATH.

cargo build实际编译,WebSocket的失败,错误None

on_error块在我的 Windows 机器上执行,但我的 Linux 机器从不执行此代码块。

就这样我们在同一页面上,这是打印语句的输出:

fn on_error(&mut self, err: ws::Error) {
    println!("On Error, {}", err)
}
Run Code Online (Sandbox Code Playgroud)

None 不是一个非常具有描述性的答案。所以我假设我只需要一些证书,因为 OpenSSL 没有附带证书。我从网上某处下载了 cacert.pem 并将其放入 OpenSSL 安装的 certs 文件夹中,但这也没有太大区别。还是一样的None错误。

在我的 Linux 机器上,我希望 websocket 连接成功并且代码继续on_open

fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> {
...
}
Run Code Online (Sandbox Code Playgroud)

有没有人在他们的 Windows 开发环境中解决过这个 OpenSSL 问题?


更新 0

根据 Cloud 的建议,我尝试使用 VCPKG。不幸的是它没有奏效。

PS C:\Users\sam\vcs\vcpkg> .\vcpkg.exe list
openssl-windows:x64-windows-static                 1.0.2q-2         OpenSSL is an open source project that provides ...
openssl-windows:x86-windows                        1.0.2q-2         OpenSSL is an open source project that provides ...
openssl:x64-windows-static                         0                OpenSSL is an open source project that provides ...
openssl:x86-windows                                0                OpenSSL is an open source project that provides ...
Run Code Online (Sandbox Code Playgroud)

然后我在我的 powershell 窗口中设置变量:

PS C:\Users\sam\vcs\project> $env:OPENSSL_DIR = 'C:\Users\sam\vcs\vcpkg\installed\x64-windows-static'
PS C:\Users\sam\vcs\project> $env:OPENSSL_STATIC = 'Yes'
PS C:\Users\sam\vcs\project> $env:VCPKGRS_DYNAMIC='1'
Run Code Online (Sandbox Code Playgroud)

然后我跑了cargo clean然后cargo build我仍然遇到同样的错误,我的 websocket 抛出错误None

这里仍然没有运气。

ZZ *_*Z 5 9

  1. 克隆vcpkg
  2. 打开您克隆 vcpkg 的目录
  3. ./bootstrap-vcpkg.bat
  4. ./vcpkg.exe install openssl-windows:x64-windows
  5. ./vcpkg.exe install openssl:x64-windows-static
  6. ./vcpkg.exe integrate install
  7. 运行set VCPKGRS_DYNAMIC=1(或简单地将其设置为您的环境变量)

  • 我还必须执行 `$env:OPENSSL_DIR="&lt;vcpkg&gt;\installed\x64-windows-static"` (9认同)
  • 4到6,命令为./vcpkg.exe命令 (2认同)

小智 8

其他答案都不适合我,但我让它与 vcpkg 和静态链接一起工作。这就是我所做的(我试图安装wrangler,它在按照以下步骤并运行后起作用cargo install wrangler)。

  1. 安装 vcpkg(按照https://github.com/Microsoft/vcpkg#quick-start-windows中的说明进行操作)。我在 Visual Studio 2019 开发人员命令提示符 ( %comspec% /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat") 中运行了此命令,但我不知道这是否有必要。

    cd C:\
    git clone https://github.com/microsoft/vcpkg
    cd vcpkg
    vcpkg\bootstrap-vcpkg.bat
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在同一命令提示符下,安装 openssl

    vcpkg\vcpkg install openssl:x64-windows-static
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安装 CA 证书(如Fatih Karan 的回答和项目的旧自述文件所述rust-openssl

    mkdir "C:\Program Files\OpenSSL-Win64\certs"
    curl --remote-name --time-cond "C:\Program Files\OpenSSL-Win64\certs\cacert.pem" -o "C:\Program Files\OpenSSL-Win64\certs\cacert.pem" https://curl.se/ca/cacert.pem
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在 Rust 项目(或任何其他目录,如果您没有 Rust 项目并且只需要cargo install某些内容)的命令提示符中,设置以下环境变量:

    set OPENSSL_NO_VENDOR=1
    set RUSTFLAGS=-Ctarget-feature=+crt-static
    set SSL_CERT_FILE=C:\OpenSSL-Win64\certs\cacert.pem
    
    Run Code Online (Sandbox Code Playgroud)
    • OPENSSL_NO_VENDORto 1:指示openssl-syscrate 使用预编译的 openssl 库。如果未设置,它将尝试编译它并失败(因为perl通常在 Windows 上不可用)。
    • RUSTFLAGSto -Ctarget-feature=+crt-static:指示 Rust 编译器(或更准确地说是 Rust 编译器调用的链接器)生成静态链接的二进制文件。如果缺少此选项,则vcpkg板条箱(板条箱使用它来查找编译的 openssl 库)将使用 vcpkg 三元组。看来这个三元组不存在。有了这个环境变量,将使用三元组,这对我有用。openssl-sysx64-windows-static-mdopensslvcpkgx64-windows-static
    • SSL_CERT_FILE到以下位置cacert.pem:您需要此文件中的根证书才能与服务器建立安全连接。


小智 8

我刚刚遇到了这个问题,但这些方法都不起作用,但以下是在 Windows 11 上对我有用的方法。

  1. 从http://slproweb.com/products/Win32OpenSSL.html安装 OpenSSL到C:\Program Files\OpenSSL-Win64

  2. 设置所有环境变量,对我来说,我设置OPENSSL_CONFC:\Program Files\OpenSSL-Win64\bin\openssl.cfg添加C:\Program Files\OpenSSL-Win64\bin到我的路径中。

  3. 假设您已安装 wget,下载证书wget https://curl.se/ca/cacert.pem -o cacert.pemC:\Program Files\OpenSSL-Win64\certs

  4. 下一步是设置构建 openssl 在 powershell 中运行的环境:

 $env:OPENSSL_NO_VENDOR=1
 $env:RUSTFLAGS='-Ctarget-feature=+crt-static'
 $env:SSL_CERT = 'C:\OpenSSL-Win64\certs\cacert.pem'
 $env:OPENSSL_DIR = 'C:\Program Files\OpenSSL-Win64'
Run Code Online (Sandbox Code Playgroud)

并运行cargo build


Kyr*_*ath 6

我遇到过同样的问题。rust-openssl 的旧版本 README 有 Windows 的安装过程。

预编译的二进制文件

这里下载预编译的二进制文件(非轻量版),并安装它。安装完成后,将环境变量OPENSSL_DIR设置为安装路径。

set OPENSSL_DIR=path\to\the\installation\dir
Run Code Online (Sandbox Code Playgroud)

如果您在安装过程中选择了将 OpenSSL DLL 复制到:OpenSSL 二进制文件 (/bin) 目录选项,请将该目录也添加到您的路径中。

set PATH=%PATH%;path\to\the\installation\dir\bin
Run Code Online (Sandbox Code Playgroud)

然后,您需要安装根证书。

使用 vcpkg

按照自述文件中的说明安装vcpkg。安装后,运行这些命令。

vcpkg install openssl:x64-windows
set VCPKG_ROOT=c:\path\to\vcpkg\installation
Run Code Online (Sandbox Code Playgroud)

然后,您需要安装根证书。

安装根证书

下载 cacert.pem 文件。将其保存到某处(即 C:\Program Files\OpenSSL-Win64\certs\cacert.pem),并添加 SSL_CERT_FILE 环境变量并将其指向该文件。

set SSL_CERT_FILE=C:\Program Files\OpenSSL-Win64\certs\cacert.pem
Run Code Online (Sandbox Code Playgroud)


Clo*_*oud -2

C/C++ 库的 Cargo 构建逻辑实际上非常简单,它只是编译一个 Rust 程序,该程序搜索包含路径和库,然后生成一些文本输出,Cargo 将使用它。

https://github.com/sfackler/rust-openssl/blob/master/openssl-sys/build/find_normal.rs我可以看到一些vcpkg关键字,那么我建议您简单地使用vcpkg来解析所有依赖项,并获取摆脱那些环境变量。