c - 使用特定的 OpenSSL 版本构建 OpenVPN

标签 c linux compilation openssl openvpn

以前曾问过类似的问题,但答案似乎不再适用,因为配置脚本的标志已更改。我正在尝试从 x86 和 x64 上的 Ubuntu 14.04.5 上的 git 源代码编译 OpenVPN。我已经构建并安装了 OpenSSL 1.0.1t 到/usr/local/ssl。我尝试了配置选项的各种组合,编译器似乎可以识别,因为

./configure OPENSSL_LIBS="-L/usr/local/ssl/ -lssl -lcrypto" OPENSSL_CFLAGS="-I/usr/local/ssl/include/"

没有错误地完成,但是 ./configure OPENSSL_LIBS="-L/usr/local/ssl/"OPENSSL_CFLAGS="-I/usr/local/ssl/include/" 结果 配置:错误:openssl 检查失败。一旦你做了 make 和 make install,它仍然报告 OpenSSL 的系统版本:

root@anonymous:/usr/local/src/openvpn# openvpn --version
OpenVPN 2.3_git [git:master/d1bd37fd508ee046] x86_64-unknown-linux-gnu [SSL (OpenSSL)]
[LZO] [LZ4] [EPOLL] [MH] [IPv6] built on Aug 16 2016
library versions: OpenSSL 1.0.1f 6 Jan 2014, LZO 2.06
Originally developed by James Yonan
Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto=yes
enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dlopen=unknown
enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=yes
enable_fragment=yes enable_iproute2=no enable_libtool_lock=yes enable_lz4=yes
enable_lzo=yes enable_management=yes enable_multi=yes enable_multihome=yes enable_pam_dlopen=no
enable_pedantic=no enable_pf=yes enable_pkcs11=no enable_plugin_auth_pam=yes
enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no
enable_server=yes enable_shared=yes enable_shared_with_static_runtimes=no enable_small=no
enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=no
 enable_werror=no enable_win32_dll=yes enable_x509_alt_username=no with_crypto_library=openssl
with_gnu_ld=yes with_mem_check=no with_plugindir='$(libdir)/openvpn/plugins' with_sysroot=no

系统 OpenSSL:

root@anonymous:/usr/local/src/openvpn# openssl version

OpenSSL 1.0.1f 6 Jan 2014

已编译的 OpenSSL:

root@anonymous:/usr/local/ssl/bin# ./openssl version

OpenSSL 1.0.1t  3 May 2016

我知道它必须是简单的东西,但我看到其他用户在 OpenVPN 论坛上询问这个问题,但到目前为止还没有回复。

最佳答案

以下是我使用 OpenSSL 1.0.2 构建 OpenVPN 的过程。 OpenSSL 1.0.1 vs. 1.0.2 vs. 1.1.0 应该无关紧要。但是,某些配置脚本在 OpenSSL 1.1.0 上失效,因为 1.1.0 使用 OPENSSL_init_ssl而不是 SSL_library_init .请注意在 Linux 上使用 RPATH(OS X 将使用不同的技术)。

OpenSSL 配置选项大部分记录在 Compilation and Installation | Configure Options在他们的维基上。我没有找到类似的 OpenVPN,并且 ./configure --help不是很有帮助。通常,对于 Autools 项目,您需要 --with-ssl=<path to ssl root> ,但 OpenVPN 似乎没有该选项。对于 OpenVPN,下面的过程使用 Autools 进行临时处理 CFLAGS .

两个库都禁用了压缩,因为它会泄露信息。有关详细信息,请参阅 Spot me if you can: Uncovering spoken phrases in encrypted VoIP conversations .问题是可变比特率编码,基本设计在其他压缩库(如 zlib)中很普遍。

OpenSSL 1.0.2

$ wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
$ tar xzf openssl-1.0.2h.tar.gz
$ cd openssl-1.0.2h

$ ./config shared no-ssl2 no-ssl3 no-comp enable-ec_nistp_64_gcc_128 -Wl,-rpath=/usr/local/ssl/lib --prefix=/usr/local/ssl
$ make -j 4
$ make test
$ sudo make install

# clear program cache
$ hash -r

您可以查看 openssl程序正在使用预期的共享对象:

$ ldd /usr/local/ssl/bin/openssl
    linux-vdso.so.1 =>  (0x00007ffc36578000)
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f94b48fb000)
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f94b448b000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f94b40c6000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f94b3ec2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f94b4b6c000)

您还可以确保新的 openssl正在执行以下操作。但是,您的问题不需要它。

$ sudo ln -s /usr/local/ssl/bin/openssl /usr/local/bin/openssl
$ hash -r
$ command -v openssl
/usr/local/bin/openssl

OpenVPN 2.3.11

$ wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.11.tar.gz
$ tar xzf openvpn-2.3.11.tar.gz
$ cd openvpn-2.3.11

$ CFLAGS="-I/usr/local/ssl/include -Wl,-rpath=/usr/local/ssl/lib -L/usr/local/ssl/lib" ./configure --disable-lzo
$ make -j 4

接下来,检查 OpenVPN 程序以查看其链接到什么:

$ find . -type f -name openvpn
./src/openvpn/openvpn
$ ldd ./src/openvpn/openvpn
    linux-vdso.so.1 =>  (0x00007ffc8bfc4000)
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f74f49f3000)
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f74f4583000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f74f437f000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f74f3fba000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f74f4c64000)

接下来,运行自检:

$ make check
...
make[3]: Entering directory `/home/jwalton/openvpn-2.3.11/tests'
./t_client.sh: cannot find 't_client.rc' in build dir ('..')
./t_client.sh: or source directory ('.'). SKIPPING TEST.
SKIP: t_client.sh
Testing cipher AES-128-CBC... OK
Testing cipher AES-128-CFB... OK
Testing cipher AES-128-CFB1... OK
...

如果测试正常,安装 OpenVPN:

$ sudo make install
$ hash -r
$ command -v openvpn
/usr/local/sbin/openvpn

最后,检查一下:

$ /usr/local/sbin/openvpn --version
OpenVPN 2.3.11 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [EPOLL] [MH] [IPv6] built on Aug 17 2016
library versions: OpenSSL 1.0.2h  3 May 2016
Originally developed by James Yonan
Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
...

如果有兴趣,您可以在 Noloader | Build-Scripts 找到一个构建脚本来自动执行该过程.它包括一个用于 OpenVPN 的。

关于c - 使用特定的 OpenSSL 版本构建 OpenVPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985889/

相关文章:

c - C中的指针与指向指针的指针

linux - 适用于 Solaris、Linux 和 HPUX 的 sed 命令

ruby-on-rails - 在 CentOS 7 上安装 Jekyll 错误

c++ - 获取C/C++/Obj-C程序编译时间

C 内联函数和内存使用

c - 包含 32 位和 64 位库的错误 ELF 类

C++ 模板编译

c++ - 从另一个 .cpp 文件的主体编译一个 .cpp 文件

c - 试图实现一堆结构

java - 使用 sshpass ssh 到远程主机并使用 java 获取结果