如何在 Ubuntu 上安装和构建 OpenSSL 1.0.0?
Posted
技术标签:
【中文标题】如何在 Ubuntu 上安装和构建 OpenSSL 1.0.0?【英文标题】:How do I install and build against OpenSSL 1.0.0 on Ubuntu? 【发布时间】:2011-03-10 08:21:29 【问题描述】:您可以将此视为How do I install the OpenSSL C++ library on Ubuntu? 的后续问题
我正在尝试在需要 OpenSSL 1.0.0 的 Ubuntu 10.04 LTS 上构建一些代码。
Ubuntu 10.04 LTS 附带 OpenSSL 0.9.8k:
$ openssl version
OpenSSL 0.9.8k 25 Mar 2009
所以在运行sudo apt-get install libssl-dev
并构建之后,运行 ldd 确认我已在 0.9.8 中链接:
$ ldd foo
...
libssl.so.0.9.8 => /lib/i686/cmov/libssl.so.0.9.8 (0x00110000)
...
libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0x002b0000)
...
如何安装 OpenSSL 1.0.0 和 1.0.0 开发包?
更新:我在阅读SB 的回答(但在尝试之前)之后写了这个更新,因为很明显我需要解释下载和安装 OpenSSL 1.0 的明显解决方案.0 不起作用:
成功执行以下操作后(建议在安装文件中):
$ ./config
$ make
$ make test
$ make install
...我还是明白了:
OpenSSL 0.9.8k 25 Mar 2009
...和:
$ sudo apt-get install libssl-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
libssl-dev is already the newest version.
The following packages were automatically installed and are no longer required:
linux-headers-2.6.32-21 linux-headers-2.6.32-21-generic
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
...并且(只是为了确保)在重建我的代码后,ldd 仍然返回相同的内容。
更新 #2:我添加了“-I/usr/local/ssl/include”和“-L/usr/local/ssl/lib”选项(由SB 建议)到我的makefile,但我现在收到一堆未定义的参考编译错误,例如:
/home/dspitzer/foo/foo.cpp:86: undefined reference to `BIO_f_base64'
/home/dspitzer/foo/foo.cpp:86: undefined reference to `BIO_new'
/usr/local/ssl/include/ 仅包含一个 openssl 目录(其中包含许多 .h 文件),所以我也尝试了“-I/usr/local/ssl/include/openssl”但得到了相同的错误。
更新 #3:我尝试更改 OpenSSL 包含的内容(例如):
#include <openssl/bio.h>
...到:
#include "openssl/bio.h"
...在 .cpp 源文件中,但仍然得到相同的未定义引用错误。
更新 #4:我现在意识到那些未定义的引用错误是链接器错误。如果我从我的 Makefile 中删除“-L/usr/local/ssl/lib”,我不会收到错误(但它链接到 OpenSSL 0.9.8)。 /usr/local/ssl/lib/的内容是:
$ ls /usr/local/ssl/lib/
engines libcrypto.a libssl.a pkgconfig
我添加了-lcrypto,错误消失了。
【问题讨论】:
++ 更新 #4。谢谢。 【参考方案1】:从here 获取 1.0.0a 源代码。
# tar -xf openssl-1.0.0a.tar.gz
# cd openssl-1.0.0a
# ./config
# sudo make install
默认情况下将它放在 /usr/local/ssl 中
构建时,您需要告诉 gcc 在 /usr/local/ssl/include 中查找头文件并与 /usr/local/ssl/lib 中的库链接。您可以通过执行以下操作来指定:
gcc test.c -o test -I/usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto
编辑不要覆盖任何系统库。最好将新库保存在 /usr/local 中。覆盖 Ubuntu 默认设置可能会危害您的健康并破坏您的系统。
此外,我刚刚在 Ubuntu 10.04 VM 中尝试过的路径是错误的。固定。
注意,无需更改 LD_LIBRARY_PATH,因为默认情况下链接的 openssl 库是静态库(至少默认情况下 - 可能有一种方法可以在 ./config 步骤中将它们配置为动态库)
您可能需要链接 libcrypto,因为您正在使用一些在 libcrypto 包中构建和定义的调用。 Openssl 1.0.0 实际上构建了两个库,libcrypto 和 libssl。
EDIT 2 将-lcrypto
添加到 gcc 行。
【讨论】:
查看上面的更新(我的问题)。你能解释一下为什么我需要添加“-lcrypto”吗? 我猜 OpenSSL 0.9.8 只有一个库 libssl? 回复:“注意,没有必要更改 LD_LIBRARY_PATH,因为默认情况下链接的 openssl 库是静态库……”——这解释了为什么我看不到 libssl.so 和 libcrypto.so当我在我的可执行文件上运行 ldd 时 libcrypto 包含所有加密原语和证书功能。 libssl 实现了 ssl/tls/dtls 协议。 libssl 调用 libcrypto。如果您使用 libssl 中的某些内容,则还需要 libcrypto,但如果您只使用 libcrypto,则不需要 libssl。 在尝试显示 openssl 1.0.0 而不是 0.9.8 时,我刚刚得到“$ gcc: test.c: No such file or directory”。有什么想法吗?【参考方案2】:代替:
$ ./config
$ make
$ make test
$ make install
做:
$ sudo ./config --prefix=/usr
$ sudo make
$ sudo make test
$ sudo make install
这将帮助您更新到 openssl 1.0.1g 以修补 CVE-2014-0160 (Heartbleed)。
OpenSSL 安全公告 [2014 年 4 月 7 日]
TLS 心跳读取溢出 (CVE-2014-0160)
在处理 TLS 心跳扩展时缺少边界检查可能是 用于向连接的客户端或服务器显示多达 64k 的内存。
只有 OpenSSL 的 1.0.1 和 1.0.2-beta 版本受到影响,包括 1.0.1f 和 1.0.2-beta1。
感谢 Google 安全部门的 Neel Mehta 发现此错误并 Adam Langley 和 Bodo Moeller 准备修复。
受影响的用户应升级到 OpenSSL 1.0.1g。用户无法立即 升级也可以使用 -DOPENSSL_NO_HEARTBEATS 重新编译 OpenSSL。
1.0.2 将在 1.0.2-beta2 中修复。
来源:https://www.openssl.org/news/secadv_20140407.txt
【讨论】:
在安装编译版本之前,请确保使用 apt-get purge 清除默认库。 请注意,您不需要手动构建和安装 OpenSSL。该补丁被反向移植到 Ubuntu 中使用的软件包(参见 advisory)。构建与您的发行版中的版本不同的版本,使用可能不同的选项,实际上可能会导致更多问题(并且不受 Ubuntu 支持)。【参考方案3】:这是为我解决的问题: Upgrade latest version OpenSSL on Ubuntu
转录主要信息:
下载 OpenSSL v1.0.0g 源码:
$ wget http://www.openssl.org/source/openssl-1.0.0g.tar.gz
解压存档并安装:
$ tar xzvf openssl-1.0.0g.tar.gz
$ cd openssl-1.0.0g
$ ./config
$ make
$ make test
$ sudo make install
所有文件,包括二进制文件和手册页都安装在目录/usr/local/ssl
下。为确保用户使用此版本的 OpenSSL 而不是以前的版本,您必须更新手册页和二进制文件的路径。
编辑文件/etc/manpath.config
,在第一个MANPATH_MAP
之前添加以下行:
MANPATH_MAP /usr/local/ssl/bin /usr/local/ssl/man
更新 man 数据库(老实说,我不记得也不确定是否需要此命令 - 可以尝试不使用它,最后在测试手册页是否仍然是旧版本时返回并运行mandb
):
sudo mandb
编辑文件 /etc/environment
并在 Ubuntu 版本的 OpenSSL (/usr/bin
) 的路径之前插入 OpenSSL 二进制文件的路径 (/usr/local/ssl/bin
)。我的环境文件如下所示:
PATH="/usr/local/sbin:/usr/local/bin:/usr/local/ssl/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
注销并登录并测试:
$ openssl version
OpenSSL 1.0.0g 18 Jan 2012
还可以通过运行man openssl
来测试手册页,并在左下角的最底部报告1.0.0g
。
请注意,尽管用户现在将自动使用新版本的 OpenSSL,但现有程序(例如 Apache)可能不会,因为它们与 Ubuntu 版本的库链接。
【讨论】:
以上是关于如何在 Ubuntu 上安装和构建 OpenSSL 1.0.0?的主要内容,如果未能解决你的问题,请参考以下文章
markdown 使用Homebrew安装的pg和openssl在Mac上构建pgmodeler