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์˜ ๋ฐฑํฌํŠธ ์ฝ”๋“œ๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ํ™˜๊ฒฝ์— ์˜์กดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚ด ํ™˜๊ฒฝ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • VPS(SAKURA ์ธํ„ฐ๋„ท)์˜ 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

    • ์ €์žฅ์†Œ๋Š” ์—ฌ๊ธฐ

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(๊ตฌ์กฐ์ฒด expbuf_t *buf)
๋ฐ˜ํ™˜ 0;
}

-#if !OPENSSL_1_1_API
+#if !OPENSSL_1_1_API && (!์ •์˜(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)

    • H2O 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 ๋ฒˆ๋“ค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ 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(๊ตฌ์กฐ์ฒด expbuf_t *buf)
๋ฐ˜ํ™˜ 0;
}

-#if !OPENSSL_1_1_API
+#if !OPENSSL_1_1_API && (!์ •์˜(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)

    • H2O 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 ๋ฒˆ๋“ค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ H2O 2.2.4+ ๋นŒ๋“œ

(์ฐธ๊ณ : "H2O 2.2.4+"๋Š” "H2O 2.2.4 + ํŒจ์น˜"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค)

์ข‹์€ ์บ์น˜!

LibreSSL < 2.7.0์—์„œ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์Œ

OpenBSD 6.2์—์„œ LibreSSL 2.6.3์„ ์‚ฌ์šฉํ•˜์—ฌ H2O 2.2.4 ๋ฐ ๋งˆ์Šคํ„ฐ ํŒจ์น˜๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด LibreSSL 2.7.1์ด ์žˆ๋Š” FreeBSD์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
์—ฌ๊ธฐ์—์„œ ํŒจ์น˜

H2O-HEAD ๋ฐ”๋‹๋ผ + LibreSSL 2.7.2๋ฅผ ๊ตฌ์ถ•ํ–ˆ์œผ๋ฉฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์•„์ง ์ถœ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋ฆด๋ฆฌ์Šค ๋ฒ„์ „(v2.2.4) + LibreSSL 2.7.x๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์œ„์˜ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@kazuho ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰