H2o: Não é possível construir com LibreSSL 2.7.0

Criado em 23 mar. 2018  ·  4Comentários  ·  Fonte: h2o/h2o

Tentei construir H2O com LibreSSL 2.7.0, lançado em 21 de março.
Em seguida, o processo de construção falha com as mensagens de erro abaixo.
(branch master (commit 0376131) e 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....

A nota de lançamento do LibreSSL diz "Adicionado suporte para muitas APIs OpenSSL 1.0.2 e 1.1" e parece que o código backport de H2O não é compatível com isso.

Não acho que esse problema dependa do meio ambiente, mas descrevo meu meio ambiente.

  • CentOS 7 em Docker em CentOS 7 (Kernel 4.15.11, de ELRepo) em VPS (SAKURA internet)
  • Construindo RPM

    • Link estático para LibreSSL

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

    • Repositório está aqui

Ele pode ser compilado com o mesmo script de compilação com LibreSSL 2.6.4.

Comentários muito úteis

Talvez funcione se aplicar os 3 patches abaixo:

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)

patch `` `
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;
}

- # if! OPENSSL_1_1_API
+ # if! 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)
  • Patches podem ser aplicados a

    • H2O-HEAD (0376131)

    • H2O 2.2.4

  • Construir com OpenSSL / LibreSSL

    • com OpenSSL

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.0.2k (pacote CentOS 7)

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.1.0g

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.1.1-pre3 (β1)

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.0.1u

    • com LibreSSL

    • Construído com sucesso H2O 2.2.4+ e HEAD com LibreSSL 2.7.0 e 2.7.1.

    • Construído com sucesso H2O 2.2.4+ com LibreSSL 2.6.4

    • Construído com sucesso H2O 2.2.4+ e HEAD com LibreSSL 2.6.3 ( @omasanori relatado no comentário abaixo)

    • Construído com sucesso H2O 2.2.4+ com LibreSSL 2.4.5 (H2O agrupado)

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

Todos 4 comentários

Talvez funcione se aplicar os 3 patches abaixo:

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)

patch `` `
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;
}

- # if! OPENSSL_1_1_API
+ # if! 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)
  • Patches podem ser aplicados a

    • H2O-HEAD (0376131)

    • H2O 2.2.4

  • Construir com OpenSSL / LibreSSL

    • com OpenSSL

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.0.2k (pacote CentOS 7)

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.1.0g

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.1.1-pre3 (β1)

    • Construído com sucesso H2O 2.2.4+ com OpenSSL 1.0.1u

    • com LibreSSL

    • Construído com sucesso H2O 2.2.4+ e HEAD com LibreSSL 2.7.0 e 2.7.1.

    • Construído com sucesso H2O 2.2.4+ com LibreSSL 2.6.4

    • Construído com sucesso H2O 2.2.4+ e HEAD com LibreSSL 2.6.3 ( @omasanori relatado no comentário abaixo)

    • Construído com sucesso H2O 2.2.4+ com LibreSSL 2.4.5 (H2O agrupado)

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

Boa pegada!

Não testado com LibreSSL <2.7.0

Eu confirmei que H2O 2.2.4 e master com seus patches podem ser construídos com sucesso com LibreSSL 2.6.3 no OpenBSD 6.2.

Confirme se isso funciona no FreeBSD com LibreSSL 2.7.1
Patch aqui

Criei H2O-HEAD vanilla + LibreSSL 2.7.2 e funciona.
Eu encerro este problema agora.

Ainda não foi lançado.
Ainda precisa do patch acima se vocês criarem a versão lançada (v2.2.4) + LibreSSL 2.7.x.

Obrigado @kazuho pelo seu trabalho.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

daniel-lucio picture daniel-lucio  ·  5Comentários

basbebe picture basbebe  ·  3Comentários

proyb6 picture proyb6  ·  5Comentários

utrenkner picture utrenkner  ·  3Comentários

utrenkner picture utrenkner  ·  8Comentários