2010-06-30 9 views
11

Puede considerar esto como una pregunta de seguimiento al How do I install the OpenSSL C++ library on Ubuntu?¿Cómo instalo y compilo contra OpenSSL 1.0.0 en Ubuntu?

Estoy tratando de construir un código en Ubuntu 10.04 LTS que requiere OpenSSL 1.0.0.

Ubuntu 10.04 LTS viene con OpenSSL 0.9.8k:

$ openssl version 
OpenSSL 0.9.8k 25 Mar 2009 

Así que después de ejecutar sudo apt-get install libssl-dev y la construcción, funcionamiento LDD confirma que he vinculado en 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) 
     ... 

¿Cómo puedo instalar OpenSSL 1.0.0 y el paquete de desarrollo 1.0.0?

actualización: Estoy escribiendo esta actualización después de leer SB 's respuesta (pero antes de probarlo), porque está claro que es necesario explicar que la solución obvia de cómo descargar e instalar OpenSSL 1.0.0 no funciona :

Después de hacer exitosamente lo siguiente (se recomienda en el archivo de instalación):

$ ./config 
    $ make 
    $ make test 
    $ make install 

... todavía consigo:

OpenSSL 0.9.8k 25 Mar 2009 

... y:

$ 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. 

... y (sólo para asegurarse) después de reconstruir mi código, LDD sigue devolviendo la misma cosa.

Actualización # 2: He añadido el "-I/usr/local/ssl/include" y "-L/usr/local/ssl/lib" opciones (sugerido por SB) a mi makefile, pero 'm ahora conseguir un montón de referencia undefine errores de compilación, por ejemplo:

/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/contiene solamente un directorio de OpenSSL (que contiene numerosos archivos .h), por lo que también probé " -I/usr/local/ssl/include/openssl "pero obtuve los mismos errores.

Actualización # 3: He intentado cambiar el OpenSSL incluye a partir de (por ejemplo):

#include <openssl/bio.h> 

... a:

#include "openssl/bio.h" 

... en el archivo de origen .cpp pero aún obtiene los mismos errores de referencia indefinidos.

Actualización n. ° 4: ahora me doy cuenta de que los errores de referencia no definidos son errores del enlazador. Si elimino el "-L/usr/local/ssl/lib" de mi Makefile, no obtengo los errores (pero se vincula con OpenSSL 0.9.8). El contenido de/usr/local/ssl/lib/son:

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

que añade -lcrypto, y los errores se fueron.

+0

++ para la actualización 4 #. Gracias. –

Respuesta

15

Obtenga la fuente 1.0.0a de here.

# tar -xf openssl-1.0.0a.tar.gz 
# cd openssl-1.0.0a 
# ./config 
# sudo make install 

Esto lo pone en// local/ssl usr por defecto

Cuando se construye, es necesario decirle a gcc para buscar las cabeceras en/usr/local/ssl/include y vínculo con libs en/usr/local/ssl/lib. Se puede especificar esta haciendo algo como:

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

EDITAR no sobrescribir ninguna librería del sistema. Lo mejor es mantener nuevas bibliotecas en/usr/local. Sobrescribir los valores predeterminados de Ubuntu puede ser peligroso para su salud y romper su sistema.

Además, estaba equivocado sobre las rutas ya que intenté esto en Ubuntu 10.04 VM. Fijo.

Nota, no hay necesidad de cambiar LD_LIBRARY_PATH ya que las bibliotecas openssl con las que se establece un vínculo de forma predeterminada son bibliotecas estáticas (al menos de forma predeterminada, puede haber una forma de configurarlas como bibliotecas dinámicas en el paso ./config)

Es posible que necesite establecer un vínculo con libcrypto porque está utilizando algunas llamadas que están compiladas y definidas en el paquete libcrypto. Openssl 1.0.0 realmente construye dos bibliotecas, libcrypto y libssl.

EDIT 2 Agregado -lcrypto a la línea gcc.

+0

Ver las actualizaciones (a mi pregunta) más arriba. ¿Puedes agregar una explicación de por qué necesitaba agregar "-lcrypto"? –

+0

Supongo que OpenSSL 0.9.8 solo tiene una biblioteca, libssl? –

+0

Re: "Tenga en cuenta, no hay necesidad de cambiar LD_LIBRARY_PATH ya que las bibliotecas openssl con las que se establece un vínculo de forma predeterminada son libs estáticos ..." - eso explica por qué no veo libssl.so & libcrypto.so cuando ejecuto ldd en mi ejecutable –

4

En lugar de:

$ ./config 
    $ make 
    $ make test 
    $ make install 

Do:

$ sudo ./config --prefix=/usr 
    $ sudo make 
    $ sudo make test 
    $ sudo make install 

Esto le ayudará a actualizar a 1.0.1g OpenSSL para parche para CVE-2014-0160 (heartbleed).

OpenSSL Security Advisory [07 Abr 2014]

TLS latido leer invadido (CVE-2.014 a 0.160)

A límites que faltan comprobar en el manejo de la extensión de los latidos del corazón TLS puede ser utilizado para revelar hasta a 64k de memoria a un cliente o servidor conectado.

Solo se ven afectadas las versiones 1.0.1 y 1.0.2-beta de OpenSSL, incluidas 1.0.1f y 1.0.2-beta1.

Gracias a Neel Mehta de Google Security por descubrir este error y al Adam Langley y Bodo Moeller por preparando la solución.

Los usuarios afectados deben actualizar a OpenSSL 1.0.1g. Los usuarios que no pueden actualizar de inmediato pueden, como alternativa, recompilar OpenSSL con -DOPENSSL_NO_HEARTBEATS.

1.0.2 se reparará en 1.0.2-beta2.

Fuente: https://www.openssl.org/news/secadv_20140407.txt

+0

Asegúrese de que la biblioteca predeterminada se purgue con apt-get purge antes de instalar la versión compilada. – Schien

+0

Tenga en cuenta que no necesita compilar e instalar OpenSSL manualmente. El parche fue transferido a los paquetes en uso en Ubuntu (ver [aviso] (http://www.ubuntu.com/usn/usn-2165-1/)). Construir una versión diferente a la de su distribución, con una opción posiblemente diferente, en realidad podría causar más problemas (y no será compatible con Ubuntu). – Bruno

0

Esto es lo que lo resolvió para mí: Upgrade latest version OpenSSL on Ubuntu

transcripción de las principales informaciones:

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's 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.