H2o: Impossible de construire avec LibreSSL 2.7.0

Créé le 23 mars 2018  ·  4Commentaires  ·  Source: h2o/h2o

J'ai essayé de construire H2O avec LibreSSL 2.7.0 sorti le 21 mars.
Ensuite, le processus de génération échoue avec les messages d'erreur ci-dessous.
(à la fois branche principale (commit 0376131) et 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 note de version de LibreSSL dit "Ajout de la prise en charge de nombreuses API OpenSSL 1.0.2 et 1.1" et il semble que le code de rétroportage de H2O n'est pas compatible avec cela.

Je ne pense pas que ce problème dépende de l'environnement, mais je décris mon environnement.

  • CentOS 7 sur Docker sur CentOS 7 (noyau 4.15.11, d'ELRepo) sur VPS (SAKURA internet)
  • RPM du bâtiment

    • Lien statique vers LibreSSL

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

    • Le référentiel est ici

Il peut construire avec le même script de construction avec LibreSSL 2.6.4.

Commentaire le plus utile

Peut-être que cela fonctionne si vous appliquez 3 correctifs ci-dessous :

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
indice 29b35a9..42356a6 100644
--- a/deps/neverbleed/neverbleed.c
+++ b/deps/neverbleed/neverbbleed.c
@@ -547,7 +547,7 @@ static int sign_stub(struct expbuf_t *buf)
renvoie 0 ;
}

-#if !OPENSSL_1_1_API
+#if !OPENSSL_1_1_API && (!defined(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)
  • Les correctifs peuvent être appliqués à

    • TÊTE H2O (0376131)

    • H2O 2.2.4

  • Construire avec OpenSSL/LibreSSL

    • avec OpenSSL

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.0.2k (paquet CentOS 7)

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.1.0g

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.1.1-pre3 (β1)

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.0.1u

    • avec LibreSSL

    • Construit avec succès H2O 2.2.4+ & HEAD avec LibreSSL 2.7.0 & 2.7.1.

    • Construit avec succès H2O 2.2.4+ avec LibreSSL 2.6.4

    • Construit avec succès H2O 2.2.4+ & HEAD avec LibreSSL 2.6.3 ( @omasanori signalé dans le commentaire ci-dessous)

    • Construit avec succès H2O 2.2.4+ avec LibreSSL 2.4.5 (H2O Bundled)

(Remarque : « H2O 2.2.4+ » signifie « H2O 2.2.4 + patchs »)

Tous les 4 commentaires

Peut-être que cela fonctionne si vous appliquez 3 correctifs ci-dessous :

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
indice 29b35a9..42356a6 100644
--- a/deps/neverbleed/neverbleed.c
+++ b/deps/neverbleed/neverbbleed.c
@@ -547,7 +547,7 @@ static int sign_stub(struct expbuf_t *buf)
renvoie 0 ;
}

-#if !OPENSSL_1_1_API
+#if !OPENSSL_1_1_API && (!defined(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)
  • Les correctifs peuvent être appliqués à

    • TÊTE H2O (0376131)

    • H2O 2.2.4

  • Construire avec OpenSSL/LibreSSL

    • avec OpenSSL

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.0.2k (paquet CentOS 7)

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.1.0g

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.1.1-pre3 (β1)

    • Construit avec succès H2O 2.2.4+ avec OpenSSL 1.0.1u

    • avec LibreSSL

    • Construit avec succès H2O 2.2.4+ & HEAD avec LibreSSL 2.7.0 & 2.7.1.

    • Construit avec succès H2O 2.2.4+ avec LibreSSL 2.6.4

    • Construit avec succès H2O 2.2.4+ & HEAD avec LibreSSL 2.6.3 ( @omasanori signalé dans le commentaire ci-dessous)

    • Construit avec succès H2O 2.2.4+ avec LibreSSL 2.4.5 (H2O Bundled)

(Remarque : « H2O 2.2.4+ » signifie « H2O 2.2.4 + patchs »)

Bonne prise!

Non testé avec LibreSSL < 2.7.0

J'ai confirmé que H2O 2.2.4 et master avec vos correctifs peuvent être construits avec succès avec LibreSSL 2.6.3 sur OpenBSD 6.2.

Confirmez que cela fonctionne sur FreeBSD avec LibreSSL 2.7.1
Patch ici

J'ai construit H2O-HEAD vanilla + LibreSSL 2.7.2 et cela fonctionne.
Je ferme ce sujet maintenant.

Il n'est pas encore sorti.
Vous avez encore besoin du correctif ci-dessus si vous construisez la version publiée (v2.2.4) + LibreSSL 2.7.x.

Merci @kazuho pour votre travail.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Jxck picture Jxck  ·  7Commentaires

voiddeveloper picture voiddeveloper  ·  6Commentaires

proyb6 picture proyb6  ·  5Commentaires

utrenkner picture utrenkner  ·  3Commentaires

ahupowerdns picture ahupowerdns  ·  8Commentaires