Как работать с OpenSSL для Rust в среде разработки Windows - PullRequest
1 голос
/ 30 апреля 2019

Я не могу построить свой проект Rust, когда я добавляю зависимость SSL в свой файл груза. Это не ново для Windows, но я хотел бы решить эту проблему так, чтобы я мог использовать Powershell и собственную разработку Windows для работы над моим проектом Rust.

Рассматриваемая зависимость следующая:

[dependencies.ws]
version = "0.8.0"
features = ["ssl"]

Когда я запускаю cargo build, я получаю много ошибок, связанных с SSL, поскольку я работаю в Windows, поэтому давайте начнем отлаживать этот шаг за шагом.

Первые ошибки:

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

Хорошо, давайте установим 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"

Тем не менее, теперь выполняющиеся cargo build или cargo run фактически компилируются, но я не думаю, что SSL работает правильно, поскольку путь к коду, который подключается к веб-сокету, завершается с ошибкой none.

Я установил последнюю (1.1.0j) полную (не тонкую) версию OpenSSL со следующего веб-сайта: https://slproweb.com/products/Win32OpenSSL.html

Единственная переменная окружения, которую он установил, была:

OPENSSL_CONF: C:\OpenSSL-Win64\bin\openssl.cfg

Но я также добавил C:\OpenSSL-Win64\bin к своему PATH.

Когда cargo build фактически скомпилирован, веб-сокет завершается с ошибкой None

Блок on_error выполняется на моем компьютере с Windows, но мой компьютер с Linux никогда не выполняет этот блок кода.

Просто мы на одной странице, это вывод оператора print:

fn on_error(&mut self, err: ws::Error) {
    println!("On Error, {}", err)
}

Нет, это не очень описательный ответ. Поэтому я предположил, что мне просто нужны некоторые сертификаты, поскольку OpenSSL не поставляется с сертификатами. Я скачал cacert.pem откуда-то онлайн и поместил его в папку certs установки OpenSSL, но это тоже не имело большого значения. Все та же ошибка None.

На моем компьютере с Linux я ожидаю, что соединение с веб-сокетом будет успешным, и код перейдет к on_open:

fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> {
...
}

Кто-нибудь работал над этой проблемой OpenSSL в своей среде разработки Windows?


ОБНОВЛЕНИЕ 0

По совету Облака я пытался использовать 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 ...

Затем я установил переменные в своем окне 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'

Затем я запустил cargo clean, а затем cargo build, и я все еще получил ту же ошибку, когда мой websocket выдает ошибку None.

Все еще не повезло здесь.

1 Ответ

0 голосов
/ 30 апреля 2019

логика построения груза для библиотек C / C ++ на самом деле довольно проста, она просто компилирует программу ржавчины, которая ищет пути включения и библиотеки, а затем выдает какой-то текстовый вывод, и груз будет его использовать.

Из https://github.com/sfackler/rust-openssl/blob/master/openssl-sys/build/find_normal.rs Я вижу некоторые vcpkg ключевые слова, тогда я бы предложил вам просто использовать vcpkg , чтобы разрешить все ваши зависимости и избавиться от этих переменных env.

...