使用特定版本的OpenSSL构建OpenVPN

11

这样的问题之前已经问过了,但由于配置脚本的标志已经更改,答案似乎不再适用。我正在尝试在Ubuntu 14.04.5上从git源代码编译OpenVPN(在x86和x64上都是如此)。我已经构建并安装了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/"会导致configure: error: openssl check failed。即使你执行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论坛上看到其他用户询问此问题,但目前还没有回复。


还可以参考OpenVPN问题跟踪器中报告的Issue 794:使用OpenSSL构建OpenVPN的过程 - jww
3个回答

22
以下是我用于使用OpenSSL 1.0.2构建OpenVPN的过程。 OpenSSL 1.0.1与1.0.2与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的构建脚本。

我点赞了这个,但我的声望太低了。我没有完全按照步骤操作,但是这让它工作了。问题在于,首先我在编译OpenSSL时没有创建*.so文件。其次,在OpenVPN构建期间,我没有正确地链接它们。我使用您列出的命令的编辑形式重新编译了OpenSSL,检查了它是否被正确链接,跳过了符号链接,因为我已经完成了这个步骤,并使用您给出的命令编译了openvpn,它完美地工作了。非常感谢您全面而正确的答案。 - Antony
@Antony - 我猜(仅仅是猜测)这样做并不完全正确:OPENSSL_CFLAGS="-I/usr/local/ssl/include/"。这些 CFLAGS 需要应用于整个 OpenVPN 构建,而不仅仅是 OpenSSL 的某个部分。我甚至不清楚 OPENSSL_CFLAGSOPENSSL_LIBS 是做什么的,因为 ./configure --help 没有解释它;安装说明也没有解释它。 - jww
我想这肯定是类似那种东西。旧版标志曾使用 OPENSSL_SSL_FLAGSOPENSSL_CRYPTO_FLAGS,但在后来的版本中被删除了。OpenVPN 和配置文档并没有很清楚地说明它们的用途。再次感谢您的帮助。我已经费尽心思,花了大约两天时间试图找出我的错误所在。 - Antony
@Antony - 我认为OPENSSL_SSL_FLAGSOPENSSL_CRYPTO_FLAGS等参数可能是用于在源代码中构建OpenSSL。即,将OpenSSL放入<openvpn src>目录中,然后OpenVPN构建系统就会为您构建OpenSSL。但再次强调,这只是一个猜测。如果不是用于此,我无法想到这些变量有其他用途。 - jww
1
非常好的写作,谢谢。我不得不添加一个额外的标志才能使OpenSSL配置工作:-Wl,--enable-new-dtags,-rpath... - Duncan Jones
显示剩余5条评论

1
OpenVPN报告了运行库的版本,因此您在这里看到的是链接/动态库的行为。可能您的ld.so.conf设置为优先使用/usr/lib/.so而不是/usr/local/lib/.so。

我认为你走在了正确的道路上。/etc/ld.so.conf 只是包含了 /etc/ld.so.conf.d 目录下的 *.conf 文件。在那个目录中,libc.conf 指向 /usr/local/lib,但 OpenSSL 的库并不驻留在那里,所以它可能会使用系统默认值。我会看看还能找到什么信息。 - Antony
我尝试将"/usr/local/ssl"和"/usr/local/ssl/lib"都添加到libc.conf中,但得到了相同的结果。此时,我认为这并不重要,因为Ubuntu上1.0.1t中的安全修复已经被移植到1.0.1f中了。 - Antony

0

我成功使用的一个解决方案是OpenVPN build-system

只需在generic/build.vars中更改OpenSSL源版本,然后让它运行(如文档所述)。

如果您遇到--dynamicbase--nxcompat等选项的问题,则还应在generic/build.vars中禁用这些标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接