如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu怎么安装openssl

ubuntu 如何安装特定版本的openssl

markdown 使用Homebrew安装的pg和openssl在Mac上构建pgmodeler

如何在 Mac 和 Windows 上构建 OpenSSL

如何使用 Visual Studio 2017 在 Windows 上构建 OpenSSL?

Ubuntu16.04使用Tarball安装ntp