如何在Ubuntu上安装和构建OpenSSL 1.0.0?

Dar*_*zer 12 c++ installation ubuntu ssl

您可以将此问题视为如何在Ubuntu上安装OpenSSL C++库的后续问题

我正在尝试在需要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
Run Code Online (Sandbox Code Playgroud)

所以在运行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)
        ...
Run Code Online (Sandbox Code Playgroud)

如何安装OpenSSL 1.0.0和1.0.0开发包?

更新:我在阅读SB的答案后(但在尝试之前)写了这个更新,因为很明显我需要解释下载和安装OpenSSL 1.0.0的明显解决方案不起作用:

成功执行以下操作后(在INSTALL文件中推荐):

  $ ./config
  $ make
  $ make test
  $ make install
Run Code Online (Sandbox Code Playgroud)

......我仍然得到:

OpenSSL 0.9.8k 25 Mar 2009
Run Code Online (Sandbox Code Playgroud)

...和:

$ 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.
Run Code Online (Sandbox Code Playgroud)

...并且(只是为了确保)在重建我的代码之后,ldd仍然返回相同的东西.

更新#2:我在我的makefile中添加了"-I/usr/local/ssl/include"和"-L/usr/local/ssl/lib"选项(由SB建议),但我现在得到一堆undefine引用编译错误,例如:

/home/dspitzer/foo/foo.cpp:86: undefined reference to `BIO_f_base64'
/home/dspitzer/foo/foo.cpp:86: undefined reference to `BIO_new'
Run Code Online (Sandbox Code Playgroud)

/ usr/local/ssl/include /只包含一个openssl目录(包含许多.h文件),所以我也试过"-I/usr/local/ssl/include/openssl",但是得到了同样的错误.

更新#3:我尝试更改OpenSSL包含(例如):

#include <openssl/bio.h>
Run Code Online (Sandbox Code Playgroud)

...至:

#include "openssl/bio.h"
Run Code Online (Sandbox Code Playgroud)

...在.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
Run Code Online (Sandbox Code Playgroud)

我添加了-lcrypto,错误消失了.

NG.*_*NG. 18

这里获取1.0.0a源代码.

# tar -xf openssl-1.0.0a.tar.gz
# cd openssl-1.0.0a
# ./config
# sudo make install
Run Code Online (Sandbox Code Playgroud)

这默认情况下将它放在/ usr/local/ssl中

构建时,需要告诉gcc在/ usr/local/ssl/include中查找头文件,并与/ usr/local/ssl/lib中的libs链接.您可以通过执行以下操作来指定:

gcc test.c -o test -I/usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto
Run Code Online (Sandbox Code Playgroud)

编辑不要覆盖任何系统库.最好将新库保留在/ usr/local中.覆盖Ubuntu默认值可能会危害您的健康并破坏您的系统.

另外,我在Ubuntu 10.04 VM中试过这个路径时错了.固定.

注意,没有必要更改LD_LIBRARY_PATH,因为默认链接的openssl库是静态库(至少在默认情况下 - 可能有一种方法可以在./config步骤中将它们配置为动态库)

您可能需要链接libcrypto,因为您正在使用在libcrypto包中构建和定义的一些调用.Openssl 1.0.0实际上构建了两个库,libcrypto和libssl.

编辑2添加-lcrypto到gcc行.

  • libcrypto包含所有加密原语和证书函数.libssl实现了ssl/tls/dtls协议.libssl调用libcrypto.如果您使用libssl中的某些内容,则还需要libcrypto,但如果您只使用libcrypto,则不需要libssl. (2认同)