H2o: Невозможно собрать с LibreSSL 2.7.0

Созданный на 23 мар. 2018  ·  4Комментарии  ·  Источник: h2o/h2o

Я пытался собрать H2O с помощью LibreSSL 2.7.0, выпущенного 21 марта.
Затем процесс сборки завершается ошибкой с сообщениями об ошибках ниже.
(как основная ветка (фиксация 0376131), так и 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....

В примечании к выпуску LibreSSL говорится: «Добавлена ​​поддержка многих API OpenSSL 1.0.2 и 1.1», и похоже, что код обратного порта H2O не совместим с этим.

Я не думаю, что эта проблема зависит от окружающей среды, но я описываю свое окружение.

  • CentOS 7 на Docker на CentOS 7 (ядро 4.15.11, от ELRepo) на VPS (Интернет SAKURA)
  • Сборка RPM

    • Статическая ссылка на LibreSSL

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

    • Репозиторий здесь

Он может строиться с использованием того же сценария сборки с LibreSSL 2.6.4.

Самый полезный комментарий

Возможно, это сработает, если применить 3 патча ниже:

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)

патч
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
индекс 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)
возврат 0;
}

- # if! OPENSSL_1_1_API
+ # if! OPENSSL_1_1_API && (! определено (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)
  • Патчи могут быть применены к

    • H2O-ГОЛОВКА (0376131)

    • H2O 2.2.4

  • Сборка с OpenSSL / LibreSSL

    • с OpenSSL

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.0.2k (пакет CentOS 7)

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.1.0g

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.1.1-pre3 (β1)

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.0.1u

    • с LibreSSL

    • Успешно построен H2O 2.2.4+ и HEAD с LibreSSL 2.7.0 и 2.7.1.

    • Успешно построен H2O 2.2.4+ с LibreSSL 2.6.4

    • Успешно построен H2O 2.2.4+ и HEAD с LibreSSL 2.6.3 ( @omasanori сообщил в комментарии ниже)

    • Успешно создана H2O 2.2.4+ с LibreSSL 2.4.5 (H2O в комплекте)

(Примечание: «H2O 2.2.4+» означает «H2O 2.2.4 + патчи»)

Все 4 Комментарий

Возможно, это сработает, если применить 3 патча ниже:

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)

патч
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
индекс 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)
возврат 0;
}

- # if! OPENSSL_1_1_API
+ # if! OPENSSL_1_1_API && (! определено (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)
  • Патчи могут быть применены к

    • H2O-ГОЛОВКА (0376131)

    • H2O 2.2.4

  • Сборка с OpenSSL / LibreSSL

    • с OpenSSL

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.0.2k (пакет CentOS 7)

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.1.0g

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.1.1-pre3 (β1)

    • Успешно построен H2O 2.2.4+ с OpenSSL 1.0.1u

    • с LibreSSL

    • Успешно построен H2O 2.2.4+ и HEAD с LibreSSL 2.7.0 и 2.7.1.

    • Успешно построен H2O 2.2.4+ с LibreSSL 2.6.4

    • Успешно построен H2O 2.2.4+ и HEAD с LibreSSL 2.6.3 ( @omasanori сообщил в комментарии ниже)

    • Успешно создана H2O 2.2.4+ с LibreSSL 2.4.5 (H2O в комплекте)

(Примечание: «H2O 2.2.4+» означает «H2O 2.2.4 + патчи»)

Хороший улов!

Не тестировалось с LibreSSL <2.7.0

Я подтвердил, что H2O 2.2.4 и master с вашими патчами могут быть успешно созданы с помощью LibreSSL 2.6.3 на OpenBSD 6.2.

Убедитесь, что это работает на FreeBSD с LibreSSL 2.7.1
Патч здесь

Я создал H2O-HEAD vanilla + LibreSSL 2.7.2, и он работает.
Я закрываю этот выпуск сейчас.

Он еще не выпущен.
По-прежнему нужен патч, описанный выше, если вы, ребята, собираете выпущенную версию (v2.2.4) + LibreSSL 2.7.x.

Спасибо @kazuho за вашу работу.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

basbebe picture basbebe  ·  3Комментарии

dch picture dch  ·  5Комментарии

voiddeveloper picture voiddeveloper  ·  6Комментарии

Ys88 picture Ys88  ·  5Комментарии

daniel-lucio picture daniel-lucio  ·  5Комментарии