H2o: 无法使用 LibreSSL 2.7.0 构建

创建于 2018-03-23  ·  4评论  ·  资料来源: h2o/h2o

我尝试使用 3 月 21 日发布的 LibreSSL 2.7.0 构建 H2O。
然后,构建过程失败并显示以下错误消息。
(主分支(提交 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 的发行说明说“添加了对许多 OpenSSL 1.0.2 和 1.1 API 的支持”,看起来 H2O 的向后移植代码与此不兼容。

我不认为这个问题与环境有关,但我描述了我的环境。

  • CentOS 7 on Docker on CentOS 7 (Kernel 4.15.11, from ELRepo) on VPS (SAKURA internet)
  • 建立 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 && (!defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER < 0x2070000fL)

静态无效 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)

    • 水 2.2.4

  • 使用 OpenSSL/LibreSSL 构建

    • 使用 OpenSSL

    • 使用 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 成功构建 H2O 2.2.4+

    • 使用 LibreSSL

    • 使用 LibreSSL 2.7.0 & 2.7.1 成功构建 H2O 2.2.4+ & HEAD。

    • 使用 LibreSSL 2.6.4 成功构建 H2O 2.2.4+

    • 使用 LibreSSL 2.6.3 成功构建了 H2O 2.2.4+ 和 HEAD( @omasanori在下面的评论中报告)

    • 使用 LibreSSL 2.4.5 (H2O Bundled) 成功构建 H2O 2.2.4+

(注:“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 && (!defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER < 0x2070000fL)

静态无效 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)

    • 水 2.2.4

  • 使用 OpenSSL/LibreSSL 构建

    • 使用 OpenSSL

    • 使用 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 成功构建 H2O 2.2.4+

    • 使用 LibreSSL

    • 使用 LibreSSL 2.7.0 & 2.7.1 成功构建 H2O 2.2.4+ & HEAD。

    • 使用 LibreSSL 2.6.4 成功构建 H2O 2.2.4+

    • 使用 LibreSSL 2.6.3 成功构建了 H2O 2.2.4+ 和 HEAD( @omasanori在下面的评论中报告)

    • 使用 LibreSSL 2.4.5 (H2O Bundled) 成功构建 H2O 2.2.4+

(注:“H2O 2.2.4+”表示“H2O 2.2.4 + 补丁”)

接得好!

未使用 LibreSSL < 2.7.0 进行测试

我已经确认 H2O 2.2.4 和带有补丁的 master 可以在 OpenBSD 6.2 上使用 LibreSSL 2.6.3 成功构建。

确认这在带有 LibreSSL 2.7.1 的 FreeBSD 上有效
补丁在这里

我已经构建了 H2O-HEAD vanilla + LibreSSL 2.7.2 并且它可以工作。
我现在关闭这个问题。

它尚未发布。
如果你们构建发布版本(v2.2.4)+ LibreSSL 2.7.x,仍然需要上面的补丁。

谢谢@kazuho的工作。

此页面是否有帮助?
0 / 5 - 0 等级