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 build或cargo 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 问题?
根据 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。
这里仍然没有运气。
./bootstrap-vcpkg.bat./vcpkg.exe install openssl-windows:x64-windows./vcpkg.exe install openssl:x64-windows-static./vcpkg.exe integrate installset VCPKGRS_DYNAMIC=1(或简单地将其设置为您的环境变量)小智 8
其他答案都不适合我,但我让它与 vcpkg 和静态链接一起工作。这就是我所做的(我试图安装wrangler,它在按照以下步骤并运行后起作用cargo install wrangler)。
安装 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)
在同一命令提示符下,安装 openssl
vcpkg\vcpkg install openssl:x64-windows-static
Run Code Online (Sandbox Code Playgroud)
安装 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)
在 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-staticSSL_CERT_FILE到以下位置cacert.pem:您需要此文件中的根证书才能与服务器建立安全连接。小智 8
我刚刚遇到了这个问题,但这些方法都不起作用,但以下是在 Windows 11 上对我有用的方法。
从http://slproweb.com/products/Win32OpenSSL.html安装 OpenSSL到C:\Program Files\OpenSSL-Win64
设置所有环境变量,对我来说,我设置OPENSSL_CONF并C:\Program Files\OpenSSL-Win64\bin\openssl.cfg添加C:\Program Files\OpenSSL-Win64\bin到我的路径中。
假设您已安装 wget,下载证书wget https://curl.se/ca/cacert.pem -o cacert.pem到C:\Program Files\OpenSSL-Win64\certs
下一步是设置构建 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
我遇到过同样的问题。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 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来解析所有依赖项,并获取摆脱那些环境变量。
| 归档时间: |
|
| 查看次数: |
6046 次 |
| 最近记录: |