H2o: No se puede compilar con LibreSSL 2.7.0

Creado en 23 mar. 2018  ·  4Comentarios  ·  Fuente: h2o/h2o

Intenté compilar H2O con LibreSSL 2.7.0 que se lanzó el 21 de marzo.
Luego, el proceso de compilación falla con los siguientes mensajes de error.
(tanto la rama maestra (comete 0376131) como H2O v2.2.4)

In file included from //rpmbuild/BUILD/repo/include/h2o/socket.h:34:0,
                 from //rpmbuild/BUILD/repo/include/h2o/multithread.h:27,
                 from //rpmbuild/BUILD/repo/include/h2o/hostinfo.h:32,
                 from //rpmbuild/BUILD/repo/lib/common/hostinfo.c:22:
//rpmbuild/BUILD/repo/include/h2o/openssl_backport.h:37:27: error: static declaration of 'BIO_meth_new' follows non-static declaration
 static inline BIO_METHOD *BIO_meth_new(int type, const char *name)
                           ^~~~~~~~~~~~
In file included from /var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/evp.h:67:0,
                 from /var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/hmac.h:67,
                 from /var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/ssl.h:149,
                 from //rpmbuild/BUILD/repo/include/h2o/socket.h:31,
                 from //rpmbuild/BUILD/repo/include/h2o/multithread.h:27,
                 from //rpmbuild/BUILD/repo/include/h2o/hostinfo.h:32,
                 from //rpmbuild/BUILD/repo/lib/common/hostinfo.c:22:
/var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/bio.h:338:13: note: previous declaration of 'BIO_meth_new' was here
 BIO_METHOD *BIO_meth_new(int type, const char *name);
             ^~~~~~~~~~~~
make[2]: *** [CMakeFiles/libh2o-evloop.dir/lib/common/hostinfo.c.o] Error 1
make[2]: *** Waiting for unfinished jobs....

La nota de lanzamiento de LibreSSL dice "Se agregó soporte para muchas API de OpenSSL 1.0.2 y 1.1" y parece que el código de backport de H2O no es compatible con eso.

No creo que este problema dependa del medio ambiente, pero describo mi entorno.

  • CentOS 7 en Docker en CentOS 7 (Kernel 4.15.11, de ELRepo) en VPS (SAKURA internet)
  • Construcción de RPM

    • Enlace estático a LibreSSL

    • cmake -DWITH_MRUBY=on -DCMAKE_INSTALL_PREFIX=%{_prefix} -DCMAKE_INCLUDE_PATH=%{libressl_root}/include -DCMAKE_LIBRARY_PATH=%{libressl_root}/lib

    • El repositorio está aquí

Puede compilar con el mismo script de compilación con LibreSSL 2.6.4.

Comentario más útil

Tal vez funcione si aplica 3 parches a continuación:

diff --git a/include/h2o/openssl_backport.h b/include/h2o/openssl_backport.h
index b24440e..b59a519 100644
--- a/include/h2o/openssl_backport.h
+++ b/include/h2o/openssl_backport.h
@@ -25,7 +25,7 @@
 #include <stdlib.h>

 /* backports for OpenSSL 1.0.2 */
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)

 #define BIO_get_data(bio) ((bio)->ptr)
 #define BIO_set_data(bio, p) ((bio)->ptr = (p))
@@ -57,7 +58,7 @@ static inline BIO_METHOD *BIO_meth_new(int type, const char *name)
 #endif

 /* backports for OpenSSL 1.0.1 and LibreSSL */
-#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10002000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)

 #define SSL_is_server(ssl) ((ssl)->server)

`` parche
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
índice 29b35a9..42356a6 100644
--- a / deps / neverbleed / neverbleed.c
+++ b / deps / neverbleed / neverbleed.c
@@ -547,7 +547,7 @@ static int sign_stub (struct expbuf_t * buf)
return 0;
}

- # si! OPENSSL_1_1_API
+ # si! OPENSSL_1_1_API && (! definido (LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER <0x2070000fL)

static void RSA_get0_key (const RSA rsa, const BIGNUM * n, const BIGNUM * e, const BIGNUM * d)
{

```patch
diff --git a/deps/picotls/lib/openssl.c b/deps/picotls/lib/openssl.c
index a19a29a..c4dfccb 100644
--- a/deps/picotls/lib/openssl.c
+++ b/deps/picotls/lib/openssl.c
@@ -41,13 +41,15 @@
 #include "picotls.h"
 #include "picotls/openssl.h"

-#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
-#define OPENSSL_1_0_API 1
+#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
+#define OPENSSL_1_1_API 1
+#elif defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
+#define OPENSSL_1_1_API 1
 #else
-#define OPENSSL_1_0_API 0
+#define OPENSSL_1_1_API 0
 #endif

-#if OPENSSL_1_0_API
+#if !OPENSSL_1_1_API

 #define EVP_PKEY_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_EVP_PKEY)
 #define X509_STORE_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_X509_STORE)
  • Los parches se pueden aplicar a

    • H2O-HEAD (0376131)

    • H2O 2.2.4

  • Construya con OpenSSL / LibreSSL

    • con OpenSSL

    • Construido exitosamente H2O 2.2.4+ con OpenSSL 1.0.2k (paquete CentOS 7)

    • Construido con éxito H2O 2.2.4+ con OpenSSL 1.1.0g

    • Construido con éxito H2O 2.2.4+ con OpenSSL 1.1.1-pre3 (β1)

    • Construido con éxito H2O 2.2.4+ con OpenSSL 1.0.1u

    • con LibreSSL

    • Construido con éxito H2O 2.2.4+ y HEAD con LibreSSL 2.7.0 y 2.7.1.

    • Construido con éxito H2O 2.2.4+ con LibreSSL 2.6.4

    • Construido con éxito H2O 2.2.4+ y HEAD con LibreSSL 2.6.3 ( @omasanori informado en el comentario a continuación)

    • Construido con éxito H2O 2.2.4+ con LibreSSL 2.4.5 (H2O incluido)

(Nota: "H2O 2.2.4+" significa "H2O 2.2.4 + parches")

Todos 4 comentarios

Tal vez funcione si aplica 3 parches a continuación:

diff --git a/include/h2o/openssl_backport.h b/include/h2o/openssl_backport.h
index b24440e..b59a519 100644
--- a/include/h2o/openssl_backport.h
+++ b/include/h2o/openssl_backport.h
@@ -25,7 +25,7 @@
 #include <stdlib.h>

 /* backports for OpenSSL 1.0.2 */
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)

 #define BIO_get_data(bio) ((bio)->ptr)
 #define BIO_set_data(bio, p) ((bio)->ptr = (p))
@@ -57,7 +58,7 @@ static inline BIO_METHOD *BIO_meth_new(int type, const char *name)
 #endif

 /* backports for OpenSSL 1.0.1 and LibreSSL */
-#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10002000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)

 #define SSL_is_server(ssl) ((ssl)->server)

`` parche
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
índice 29b35a9..42356a6 100644
--- a / deps / neverbleed / neverbleed.c
+++ b / deps / neverbleed / neverbleed.c
@@ -547,7 +547,7 @@ static int sign_stub (struct expbuf_t * buf)
return 0;
}

- # si! OPENSSL_1_1_API
+ # si! OPENSSL_1_1_API && (! definido (LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER <0x2070000fL)

static void RSA_get0_key (const RSA rsa, const BIGNUM * n, const BIGNUM * e, const BIGNUM * d)
{

```patch
diff --git a/deps/picotls/lib/openssl.c b/deps/picotls/lib/openssl.c
index a19a29a..c4dfccb 100644
--- a/deps/picotls/lib/openssl.c
+++ b/deps/picotls/lib/openssl.c
@@ -41,13 +41,15 @@
 #include "picotls.h"
 #include "picotls/openssl.h"

-#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
-#define OPENSSL_1_0_API 1
+#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
+#define OPENSSL_1_1_API 1
+#elif defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
+#define OPENSSL_1_1_API 1
 #else
-#define OPENSSL_1_0_API 0
+#define OPENSSL_1_1_API 0
 #endif

-#if OPENSSL_1_0_API
+#if !OPENSSL_1_1_API

 #define EVP_PKEY_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_EVP_PKEY)
 #define X509_STORE_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_X509_STORE)
  • Los parches se pueden aplicar a

    • H2O-HEAD (0376131)

    • H2O 2.2.4

  • Construya con OpenSSL / LibreSSL

    • con OpenSSL

    • Construido exitosamente H2O 2.2.4+ con OpenSSL 1.0.2k (paquete CentOS 7)

    • Construido con éxito H2O 2.2.4+ con OpenSSL 1.1.0g

    • Construido con éxito H2O 2.2.4+ con OpenSSL 1.1.1-pre3 (β1)

    • Construido con éxito H2O 2.2.4+ con OpenSSL 1.0.1u

    • con LibreSSL

    • Construido con éxito H2O 2.2.4+ y HEAD con LibreSSL 2.7.0 y 2.7.1.

    • Construido con éxito H2O 2.2.4+ con LibreSSL 2.6.4

    • Construido con éxito H2O 2.2.4+ y HEAD con LibreSSL 2.6.3 ( @omasanori informado en el comentario a continuación)

    • Construido con éxito H2O 2.2.4+ con LibreSSL 2.4.5 (H2O incluido)

(Nota: "H2O 2.2.4+" significa "H2O 2.2.4 + parches")

¡Buena atrapada!

No probado con LibreSSL <2.7.0

Confirmé que H2O 2.2.4 y master con sus parches se pueden construir con éxito con LibreSSL 2.6.3 en OpenBSD 6.2.

Confirme que esto funciona en FreeBSD con LibreSSL 2.7.1
Parche aquí

He construido H2O-HEAD vanilla + LibreSSL 2.7.2 y funciona.
Cierro este tema ahora.

Aún no se ha lanzado.
Todavía necesita el parche anterior si ustedes construyen la versión publicada (v2.2.4) + LibreSSL 2.7.x.

Gracias @kazuho por tu trabajo.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

basbebe picture basbebe  ·  10Comentarios

ghost picture ghost  ·  10Comentarios

mingodad picture mingodad  ·  14Comentarios

HLFH picture HLFH  ·  10Comentarios

aafanasyev picture aafanasyev  ·  10Comentarios