Как установить и построить с OpenSSL 1.0.0 на Ubuntu?

Вы можете рассмотреть этот вопрос после Как установить библиотеку OpenSSL С++ на Ubuntu?

Я пытаюсь создать код на Ubuntu 10.04 LTS, который требует OpenSSL 1.0.0.

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 не работает:

После успешного выполнения следующего (рекомендуется в файле INSTALL):

  $ ./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, но все же получите те же undefined опорные ошибки.

Обновление # 4: теперь я понимаю, что эти справочные ошибки undefined являются ошибками компоновщика. Если я удалю "-L/usr/local/ssl/lib" из моего Makefile, я не получу ошибки (но он ссылается на OpenSSL 0.9.8). Содержимое /usr/local/ssl/lib/:

$ ls /usr/local/ssl/lib/
engines  libcrypto.a  libssl.a  pkgconfig

Я добавил -lcrypto, и ошибки исчезли.

Ответ 1

Получить источник 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 и связываться с libs в /usr/local/ssl/lib. Вы можете указать это, выполнив что-то вроде:

gcc test.c -o test -I/usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto

РЕДАКТИРОВАТЬ НЕ перезаписывать системные библиотеки. Лучше сохранить новые библиотеки в /usr/local. Overwriting Ubuntu по умолчанию может быть опасным для вашего здоровья и нарушить вашу систему.

Кроме того, я ошибался в отношении путей, поскольку я просто попробовал это в Ubuntu 10.04 VM. Фиксированный.

Обратите внимание, что нет необходимости изменять LD_LIBRARY_PATH, так как по умолчанию вы открываете libsLibRARY_PATH, это статические библиотеки (по крайней мере по умолчанию - может быть способ настроить их как динамические libs на шаге. /config )

Вам может потребоваться ссылка на libcrypto, поскольку вы используете некоторые вызовы, которые создаются и определяются в пакете libcrypto. Openssl 1.0.0 фактически создает две библиотеки, libcrypto и libssl.

EDIT 2 Добавлена ​​строка -lcrypto в gcc.

Ответ 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 [07 апр 2014]

Превышение переполнения сердцевины TLS (CVE-2014-0160)

Проверка недостающих границ при обработке расширения сердцебиения TLS может быть используется для обнаружения до 64k памяти подключенному клиенту или серверу.

Исключаются только версии 1.0.1 и 1.0.2-бета OpenSSL, включая 1.0.1f и 1.0.2-beta1.

Спасибо за Нил Мехту из Google Security за обнаружение этой ошибки и Адам Лэнгли и Бодо Мёллер для подготовка исправления.

Затронутые пользователи должны перейти на OpenSSL 1.0.1g. Пользователи не могут сразу обновление может альтернативно перекомпилировать OpenSSL с -DOPENSSL_NO_HEARTBEATS.

1.0.2 будет исправлено в 1.0.2-beta2.

Источник: https://www.openssl.org/news/secadv_20140407.txt

Ответ 3

Вот что решило это для меня: Обновите последнюю версию OpenSSL на Ubuntu

Переписывание основных сведений:

Download the OpenSSL v1.0.0g source:

$ wget http://www.openssl.org/source/openssl-1.0.0g.tar.gz

Unpack the archive and install:

$ tar xzvf openssl-1.0.0g.tar.gz
$ cd openssl-1.0.0g
$ ./config
$ make
$ make test
$ sudo make install

All files, including binaries and man pages are install under the directory /usr/local/ssl. To ensure users use this version of OpenSSL instead of the previous version you must update the paths for man pages and binaries.

Edit the file /etc/manpath.config adding the following line before the first MANPATH_MAP:

MANPATH_MAP     /usr/local/ssl/bin      /usr/local/ssl/man

Update the man database (I honestly can't remember and don't know for sure if this command was necessary - maybe try without it and at the end when testing if the man pages are still the old versions come back and run mandb):

sudo mandb

Edit the file /etc/environment and insert the path for OpenSSL binaries (/usr/local/ssl/bin) before the path for Ubuntu version of OpenSSL (/usr/bin). My environment file looks like this:

PATH="/usr/local/sbin:/usr/local/bin:/usr/local/ssl/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

Logout and login and test:

$ openssl version
OpenSSL 1.0.0g 18 Jan 2012

Also test the man pages by running man openssl and at the very bottom in the left hand corner it should report 1.0.0g.

Note that although the users will now automatically use the new version of OpenSSL, existing programs (e.g. Apache) may not as they are linked against the libraries from the Ubuntu version.