H2o: LibreSSL2.7.0でビルドできません

作成日 2018年03月23日  ·  4コメント  ·  ソース: h2o/h2o

3月21日にリリースされたLibreSSL2.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のリリースノートには「多くのOpenSSL1.0.2および1.1APIのサポートが追加されました」と記載されており、H2Oのバックポートコードはそれと互換性がないようです。

この問題は環境に依存しているとは思いませんが、私は自分の環境について説明します。

  • VPS(さくらインターネット)上のCentOS 7(ELRepoのカーネル4.15.11)上のDocker上のCentOS 7
  • RPMの構築

    • LibreSSLへの静的リンク

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

    • リポジトリはこちら

LibreSSL2.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..42356a6100644
--- 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)

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-HEAD(0376131)

    • H2O 2.2.4

  • OpenSSL / LibreSSLでビルドする

    • OpenSSLを使用

    • OpenSSL1.0.2k(CentOS 7パッケージ)を使用してH2O2.2.4 +を正常に構築しました

    • OpenSSL1.1.0gでH2O2.2.4 +が正常に構築されました

    • OpenSSL 1.1.1-pre3(β1)を使用してH2O2.2.4 +を正常に構築しました

    • OpenSSL1.0.1uでH2O2.2.4 +が正常に構築されました

    • LibreSSLを使用

    • LibreSSL2.7.0および2.7.1を使用してH2O2.2.4 +およびHEADを正常に構築しました。

    • LibreSSL2.6.4を使用してH2O2.2.4 +を正常に構築しました

    • LibreSSL2.6.3を使用してH2O2.2.4 +およびHEADを正常に構築しました( @omasanoriは以下のコメントで報告されています)

    • LibreSSL 2.4.5(H2Oバンドル)を使用してH2O2.2.4 +が正常に構築されました

(注:「H2O2.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..42356a6100644
--- 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)

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-HEAD(0376131)

    • H2O 2.2.4

  • OpenSSL / LibreSSLでビルドする

    • OpenSSLを使用

    • OpenSSL1.0.2k(CentOS 7パッケージ)を使用してH2O2.2.4 +を正常に構築しました

    • OpenSSL1.1.0gでH2O2.2.4 +が正常に構築されました

    • OpenSSL 1.1.1-pre3(β1)を使用してH2O2.2.4 +を正常に構築しました

    • OpenSSL1.0.1uでH2O2.2.4 +が正常に構築されました

    • LibreSSLを使用

    • LibreSSL2.7.0および2.7.1を使用してH2O2.2.4 +およびHEADを正常に構築しました。

    • LibreSSL2.6.4を使用してH2O2.2.4 +を正常に構築しました

    • LibreSSL2.6.3を使用してH2O2.2.4 +およびHEADを正常に構築しました( @omasanoriは以下のコメントで報告されています)

    • LibreSSL 2.4.5(H2Oバンドル)を使用してH2O2.2.4 +が正常に構築されました

(注:「H2O2.2.4 +」は、「H2O 2.2.4 +パッチ」を意味します)

いいキャッチ!

LibreSSL <2.7.0ではテストされていません

H2O 2.2.4とパッチを使用したマスターは、OpenBSD6.2上のLibreSSL2.6.3で正常にビルドできることを確認しました。

これがLibreSSL2.7.1を使用するFreeBSDで機能することを確認します
ここにパッチを当てる

H2O-HEADバニラ+ LibreSSL 2.7.2を作成しましたが、動作します。
私は今この問題を閉じます。

まだリリースされていません。
リリースされたバージョン(v2.2.4)+ LibreSSL 2.7.xをビルドする場合は、上記のパッチが必要です。

@kazuhoさん、

このページは役に立ちましたか?
0 / 5 - 0 評価