mirror of
https://github.com/nghttp2/nghttp2.git
synced 2025-12-06 18:18:52 +08:00
Merge pull request #2333 from nghttp2/quic-ossl
h2load, nghttpx: Add libngtcp2_crypto_ossl support
This commit is contained in:
24
.github/workflows/build.yml
vendored
24
.github/workflows/build.yml
vendored
@@ -7,7 +7,7 @@ permissions: read-all
|
||||
env:
|
||||
LIBBPF_VERSION: v1.5.0
|
||||
OPENSSL1_VERSION: 1_1_1w+quic
|
||||
OPENSSL3_VERSION: 3.1.7+quic
|
||||
OPENSSL3_VERSION: 3.5.0
|
||||
BORINGSSL_VERSION: 23018360710de333b3343e63cbb3bd2dceb3287d
|
||||
AWSLC_VERSION: v1.49.1
|
||||
NGHTTP3_VERSION: v1.9.0
|
||||
@@ -133,12 +133,12 @@ jobs:
|
||||
./config --prefix=$PWD/build
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
make install_sw
|
||||
- name: Build quictls/openssl v3.x
|
||||
- name: Build openssl/openssl v3.x
|
||||
if: steps.cache-openssl3.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b openssl-${{ env.OPENSSL3_VERSION }} https://github.com/quictls/openssl openssl3
|
||||
git clone --recursive --shallow-submodules --depth 1 -b openssl-${{ env.OPENSSL3_VERSION }} https://github.com/openssl/openssl openssl3
|
||||
cd openssl3
|
||||
./config enable-ktls --prefix=$PWD/build --libdir=$PWD/build/lib
|
||||
./config enable-ktls --prefix=$PWD/build
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
make install_sw
|
||||
- name: Build BoringSSL
|
||||
@@ -203,7 +203,7 @@ jobs:
|
||||
cd ngtcp2-openssl3
|
||||
autoreconf -i
|
||||
./configure --prefix=$PWD/build --enable-lib-only \
|
||||
PKG_CONFIG_PATH="../openssl3/build/lib/pkgconfig" \
|
||||
PKG_CONFIG_PATH="../openssl3/build/lib64/pkgconfig:../openssl3/build/lib/pkgconfig" \
|
||||
BORINGSSL_CFLAGS="-I$PWD/../aws-lc/include/" \
|
||||
BORINGSSL_LIBS="-L$PWD/../aws-lc/build/ssl -lssl -L$PWD/../aws-lc/build/crypto -lcrypto" \
|
||||
--disable-dependency-tracking \
|
||||
@@ -223,10 +223,6 @@ jobs:
|
||||
http3: [http3, no-http3]
|
||||
openssl: [openssl1, openssl3, boringssl, awslc, wolfssl]
|
||||
exclude:
|
||||
- os: macos-14
|
||||
openssl: openssl3
|
||||
- os: macos-15
|
||||
openssl: openssl3
|
||||
- http3: no-http3
|
||||
openssl: openssl3
|
||||
- os: macos-14
|
||||
@@ -365,7 +361,7 @@ jobs:
|
||||
path: openssl1/build
|
||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL1_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Restore quictls/openssl v3.x cache
|
||||
- name: Restore openssl/openssl v3.x cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.openssl == 'openssl3'
|
||||
with:
|
||||
@@ -459,16 +455,16 @@ jobs:
|
||||
- name: Setup extra environment variables
|
||||
if: matrix.http3 == 'no-http3'
|
||||
run: |
|
||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib"
|
||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib64/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib64 -Wl,-rpath,$PWD/openssl3/build/lib"
|
||||
|
||||
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
|
||||
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
|
||||
- name: Setup extra environment variables for HTTP/3
|
||||
if: matrix.http3 == 'http3'
|
||||
run: |
|
||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2-openssl1/build/lib/pkgconfig:$PWD/ngtcp2-openssl3/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
|
||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib64/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2-openssl1/build/lib/pkgconfig:$PWD/ngtcp2-openssl3/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib64 -Wl,-rpath,$PWD/openssl3/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
|
||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --enable-http3"
|
||||
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DENABLE_HTTP3=1"
|
||||
|
||||
|
||||
@@ -71,15 +71,19 @@ if(WITH_WOLFSSL)
|
||||
else()
|
||||
find_package(OpenSSL 1.1.1)
|
||||
endif()
|
||||
find_package(Libngtcp2 1.0.0)
|
||||
find_package(Libngtcp2 1.12.0)
|
||||
if(OPENSSL_FOUND)
|
||||
find_package(Libngtcp2_crypto_quictls 1.0.0)
|
||||
find_package(Libngtcp2_crypto_quictls 1.12.0)
|
||||
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1)
|
||||
endif()
|
||||
find_package(Libngtcp2_crypto_ossl 1.12.0)
|
||||
if(LIBNGTCP2_CRYPTO_OSSL_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_OSSL 1)
|
||||
endif()
|
||||
endif()
|
||||
if(WOLFSSL_FOUND)
|
||||
find_package(Libngtcp2_crypto_wolfssl 1.0.0)
|
||||
find_package(Libngtcp2_crypto_wolfssl 1.12.0)
|
||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1)
|
||||
endif()
|
||||
@@ -199,7 +203,10 @@ if(NOT ENABLE_LIB_ONLY AND OPENSSL_FOUND)
|
||||
if(ENABLE_HTTP3)
|
||||
check_symbol_exists(SSL_provide_quic_data "openssl/ssl.h" HAVE_SSL_PROVIDE_QUIC_DATA)
|
||||
if(NOT HAVE_SSL_PROVIDE_QUIC_DATA)
|
||||
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_provide_quic_data. HTTP/3 support cannot be enabled")
|
||||
check_symbol_exists(SSL_set_quic_tls_cbs "openssl/ssl.h" HAVE_SSL_SET_QUIC_TLS_CBS)
|
||||
if(NOT HAVE_SSL_SET_QUIC_TLS_CBS)
|
||||
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} has neither SSL_provide_quic_data nor SSL_set_quic_tls_cbs. HTTP/3 support cannot be enabled")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
cmake_pop_check_state()
|
||||
@@ -280,11 +287,12 @@ if(ENABLE_APP AND NOT (ZLIB_FOUND AND (OPENSSL_FOUND OR WOLFSSL_FOUND) AND LIBEV
|
||||
endif()
|
||||
|
||||
# HTTP/3 requires libngtcp2 + (quictls/openssl +
|
||||
# libngtcp2_crypto_quictls or wolfSSL + libngtcp2_crypto_wolfssl) and
|
||||
# libnghttp3.
|
||||
# libngtcp2_crypto_quictls, wolfSSL + libngtcp2_crypto_wolfssl, or
|
||||
# openssl/openssl + libngtcp2_crypto_ossl) and libnghttp3.
|
||||
if(ENABLE_HTTP3 AND NOT (LIBNGTCP2_FOUND AND LIBNGHTTP3_FOUND AND
|
||||
((HAVE_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND) OR
|
||||
(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_WOLFSSL_FOUND))))
|
||||
(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_WOLFSSL_FOUND) OR
|
||||
(HAVE_SSL_SET_QUIC_TLS_CBS AND LIBNGTCP2_CRYPTO_OSSL_FOUND))))
|
||||
message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.")
|
||||
endif()
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
|
||||
cmake/FindLibbrotlienc.cmake \
|
||||
cmake/FindLibbrotlidec.cmake \
|
||||
cmake/FindLibngtcp2_crypto_wolfssl.cmake \
|
||||
cmake/FindLibngtcp2_crypto_ossl.cmake \
|
||||
cmake/FindWolfSSL.cmake \
|
||||
cmake/PickyWarningsC.cmake \
|
||||
cmake/PickyWarningsCXX.cmake
|
||||
|
||||
@@ -123,12 +123,12 @@ exploited. The neverbleed is disabled by default. To enable it, use
|
||||
To enable the experimental HTTP/3 support for h2load and nghttpx, the
|
||||
following libraries are required:
|
||||
|
||||
* `OpenSSL with QUIC support
|
||||
* `quictls
|
||||
<https://github.com/quictls/openssl/tree/OpenSSL_1_1_1w+quic>`_; or
|
||||
wolfSSL; or LibreSSL (does not support 0RTT); or aws-lc; or
|
||||
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
|
||||
23018360710de333b3343e63cbb3bd2dceb3287d)
|
||||
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 1.4.0
|
||||
23018360710de333b3343e63cbb3bd2dceb3287d); or OpenSSL >= 3.5.0
|
||||
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 1.12.0
|
||||
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 1.1.0
|
||||
|
||||
Use ``--enable-http3`` configure option to enable HTTP/3 feature for
|
||||
|
||||
43
cmake/FindLibngtcp2_crypto_ossl.cmake
Normal file
43
cmake/FindLibngtcp2_crypto_ossl.cmake
Normal file
@@ -0,0 +1,43 @@
|
||||
# - Try to find libngtcp2_crypto_ossl
|
||||
# Once done this will define
|
||||
# LIBNGTCP2_CRYPTO_OSSL_FOUND - System has libngtcp2_crypto_ossl
|
||||
# LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS - The libngtcp2_crypto_ossl include directories
|
||||
# LIBNGTCP2_CRYPTO_OSSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_ossl
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_OSSL QUIET libngtcp2_crypto_ossl)
|
||||
|
||||
find_path(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
|
||||
NAMES ngtcp2/ngtcp2_crypto_ossl.h
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGTCP2_CRYPTO_OSSL_LIBRARY
|
||||
NAMES ngtcp2_crypto_ossl
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_OSSL_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR}/ngtcp2/version.h"
|
||||
LIBNGTCP2_CRYPTO_OSSL_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGTCP2_CRYPTO_OSSL_VERSION "${LIBNGTCP2_CRYPTO_OSSL_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set
|
||||
# LIBNGTCP2_CRYPTO_OSSL_FOUND to TRUE if all listed variables are
|
||||
# TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libngtcp2_crypto_ossl REQUIRED_VARS
|
||||
LIBNGTCP2_CRYPTO_OSSL_LIBRARY
|
||||
LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGTCP2_CRYPTO_OSSL_VERSION)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_OSSL_FOUND)
|
||||
set(LIBNGTCP2_CRYPTO_OSSL_LIBRARIES ${LIBNGTCP2_CRYPTO_OSSL_LIBRARY})
|
||||
set(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
|
||||
LIBNGTCP2_CRYPTO_OSSL_LIBRARY)
|
||||
41
configure.ac
41
configure.ac
@@ -450,6 +450,15 @@ if test "x${request_openssl}" != "xno" &&
|
||||
[AC_MSG_RESULT([yes]); have_ssl_provide_quic_data=yes],
|
||||
[AC_MSG_RESULT([no]); have_ssl_provide_quic_data=no])
|
||||
|
||||
AC_MSG_CHECKING([for SSL_set_quic_tls_cbs])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <openssl/ssl.h>
|
||||
]], [[
|
||||
SSL_set_quic_tls_cbs(NULL, NULL, NULL);
|
||||
]])],
|
||||
[AC_MSG_RESULT([yes]); have_ossl_quic=yes],
|
||||
[AC_MSG_RESULT([no]); have_ossl_quic=no])
|
||||
|
||||
# boringssl has SSL_set_quic_early_data_context.
|
||||
AC_MSG_CHECKING([for SSL_set_quic_early_data_context])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@@ -530,7 +539,7 @@ fi
|
||||
# ngtcp2 (for src)
|
||||
have_libngtcp2=no
|
||||
if test "x${request_libngtcp2}" != "xno"; then
|
||||
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 1.4.0], [have_libngtcp2=yes],
|
||||
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 1.12.0], [have_libngtcp2=yes],
|
||||
[have_libngtcp2=no])
|
||||
if test "x${have_libngtcp2}" = "xno"; then
|
||||
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
|
||||
@@ -547,7 +556,7 @@ have_libngtcp2_crypto_wolfssl=no
|
||||
if test "x${have_wolfssl_quic}" = "xyes" &&
|
||||
test "x${request_libngtcp2}" != "xno"; then
|
||||
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_WOLFSSL],
|
||||
[libngtcp2_crypto_wolfssl >= 1.0.0],
|
||||
[libngtcp2_crypto_wolfssl >= 1.12.0],
|
||||
[have_libngtcp2_crypto_wolfssl=yes],
|
||||
[have_libngtcp2_crypto_wolfssl=no])
|
||||
if test "x${have_libngtcp2_crypto_wolfssl}" = "xno"; then
|
||||
@@ -570,7 +579,7 @@ if test "x${have_ssl_provide_quic_data}" = "xyes" &&
|
||||
test "x${have_boringssl_quic}" != "xyes" &&
|
||||
test "x${request_libngtcp2}" != "xno"; then
|
||||
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_QUICTLS],
|
||||
[libngtcp2_crypto_quictls >= 1.0.0],
|
||||
[libngtcp2_crypto_quictls >= 1.12.0],
|
||||
[have_libngtcp2_crypto_quictls=yes],
|
||||
[have_libngtcp2_crypto_quictls=no])
|
||||
if test "x${have_libngtcp2_crypto_quictls}" = "xno"; then
|
||||
@@ -610,6 +619,28 @@ if test "x${have_boringssl_quic}" = "xyes" &&
|
||||
AC_MSG_ERROR([libngtcp2_crypto_boringssl was requested (--with-libngtcp2) but not found])
|
||||
fi
|
||||
|
||||
# ngtcp2_crypto_ossl (for src)
|
||||
have_libngtcp2_crypto_ossl=no
|
||||
if test "x${have_ossl_quic}" = "xyes" &&
|
||||
test "x${request_libngtcp2}" != "xno"; then
|
||||
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OSSL],
|
||||
[libngtcp2_crypto_ossl >= 1.12.0],
|
||||
[have_libngtcp2_crypto_ossl=yes],
|
||||
[have_libngtcp2_crypto_ossl=no])
|
||||
if test "x${have_libngtcp2_crypto_ossl}" = "xno"; then
|
||||
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OSSL_PKG_ERRORS)
|
||||
else
|
||||
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_OSSL], [1],
|
||||
[Define to 1 if you have `libngtcp2_crypto_ossl` library.])
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x${have_ossl_quic}" = "xyes" &&
|
||||
test "x${request_libngtcp2}" = "xyes" &&
|
||||
test "x${have_libngtcp2_crypto_ossl}" != "xyes"; then
|
||||
AC_MSG_ERROR([libngtcp2_crypto_ossl was requested (--with-libngtcp2) but not found])
|
||||
fi
|
||||
|
||||
# nghttp3 (for src)
|
||||
have_libnghttp3=no
|
||||
if test "x${request_libnghttp3}" != "xno"; then
|
||||
@@ -842,7 +873,8 @@ if test "x${request_http3}" != "xno" &&
|
||||
test "x${have_libngtcp2}" = "xyes" &&
|
||||
(test "x${have_libngtcp2_crypto_wolfssl}" = "xyes" ||
|
||||
test "x${have_libngtcp2_crypto_quictls}" = "xyes" ||
|
||||
test "x${have_libngtcp2_crypto_boringssl}" = "xyes") &&
|
||||
test "x${have_libngtcp2_crypto_boringssl}" = "xyes" ||
|
||||
test "x${have_libngtcp2_crypto_ossl}" = "xyes") &&
|
||||
test "x${have_libnghttp3}" = "xyes"; then
|
||||
enable_http3=yes
|
||||
AC_DEFINE([ENABLE_HTTP3], [1], [Define to 1 if HTTP/3 is enabled.])
|
||||
@@ -1256,6 +1288,7 @@ AC_MSG_NOTICE([summary of build options:
|
||||
libngtcp2: ${have_libngtcp2} (CFLAGS='${LIBNGTCP2_CFLAGS}' LIBS='${LIBNGTCP2_LIBS}')
|
||||
libngtcp2_crypto_quictls: ${have_libngtcp2_crypto_quictls} (CFLAGS='${LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBS}')
|
||||
libngtcp2_crypto_boringssl: ${have_libngtcp2_crypto_boringssl} (CFLAGS='${LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_BORINGSSL_LIBS}')
|
||||
libngtcp2_crypto_ossl: ${have_libngtcp2_crypto_ossl} (CFLAGS='${LIBNGTCP2_CRYPTO_OSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_OSSL_LIBS}')
|
||||
libnghttp3: ${have_libnghttp3} (CFLAGS='${LIBNGHTTP3_CFLAGS}' LIBS='${LIBNGHTTP3_LIBS}')
|
||||
libbpf: ${have_libbpf} (CFLAGS='${LIBBPF_CFLAGS}' LIBS='${LIBBPF_LIBS}')
|
||||
Libevent(SSL): ${have_libevent_openssl} (CFLAGS='${LIBEVENT_OPENSSL_CFLAGS}' LIBS='${LIBEVENT_OPENSSL_LIBS}')
|
||||
|
||||
@@ -17,6 +17,7 @@ include_directories(
|
||||
${LIBNGTCP2_INCLUDE_DIRS}
|
||||
${LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS}
|
||||
${LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS}
|
||||
${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS}
|
||||
${OPENSSL_INCLUDE_DIRS}
|
||||
${WOLFSSL_INCLUDE_DIRS}
|
||||
${LIBCARES_INCLUDE_DIRS}
|
||||
@@ -37,6 +38,7 @@ link_libraries(
|
||||
${LIBNGTCP2_LIBRARIES}
|
||||
${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}
|
||||
${LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES}
|
||||
${LIBNGTCP2_CRYPTO_OSSL_LIBRARIES}
|
||||
${OPENSSL_LIBRARIES}
|
||||
${WOLFSSL_LIBRARIES}
|
||||
${LIBCARES_LIBRARIES}
|
||||
|
||||
@@ -48,6 +48,7 @@ AM_CPPFLAGS = \
|
||||
@LIBNGTCP2_CRYPTO_WOLFSSL_CFLAGS@ \
|
||||
@LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS@ \
|
||||
@LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS@ \
|
||||
@LIBNGTCP2_CRYPTO_OSSL_CFLAGS@ \
|
||||
@LIBNGTCP2_CFLAGS@ \
|
||||
@WOLFSSL_CFLAGS@ \
|
||||
@OPENSSL_CFLAGS@ \
|
||||
@@ -71,6 +72,7 @@ LDADD = $(top_builddir)/lib/libnghttp2.la \
|
||||
@LIBNGTCP2_CRYPTO_WOLFSSL_LIBS@ \
|
||||
@LIBNGTCP2_CRYPTO_QUICTLS_LIBS@ \
|
||||
@LIBNGTCP2_CRYPTO_BORINGSSL_LIBS@ \
|
||||
@LIBNGTCP2_CRYPTO_OSSL_LIBS@ \
|
||||
@LIBNGTCP2_LIBS@ \
|
||||
@WOLFSSL_LIBS@ \
|
||||
@OPENSSL_LIBS@ \
|
||||
|
||||
@@ -68,6 +68,9 @@
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_WOLFSSL
|
||||
# include <ngtcp2/ngtcp2_crypto_wolfssl.h>
|
||||
# endif // HAVE_LIBNGTCP2_CRYPTO_WOLFSSL
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_OSSL
|
||||
# include <ngtcp2/ngtcp2_crypto_ossl.h>
|
||||
# endif // HAVE_LIBNGTCP2_CRYPTO_OSSL
|
||||
#endif // ENABLE_HTTP3
|
||||
|
||||
#include "urlparse.h"
|
||||
@@ -514,16 +517,18 @@ Client::Client(uint32_t id, Worker *worker, size_t req_todo)
|
||||
Client::~Client() {
|
||||
disconnect();
|
||||
|
||||
// Free ssl before freeing QUIC resources because
|
||||
// libngtcp2_crypto_ossl requires that ngtcp2_conn is still alive.
|
||||
if (ssl) {
|
||||
SSL_free(ssl);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_HTTP3
|
||||
if (config.is_quic()) {
|
||||
quic_free();
|
||||
}
|
||||
#endif // ENABLE_HTTP3
|
||||
|
||||
if (ssl) {
|
||||
SSL_free(ssl);
|
||||
}
|
||||
|
||||
worker->sample_client_stat(&cstat);
|
||||
++worker->client_smp.n;
|
||||
}
|
||||
@@ -2923,6 +2928,21 @@ int main(int argc, char **argv) {
|
||||
act.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &act, nullptr);
|
||||
|
||||
#ifdef ENABLE_HTTP3
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_QUICTLS
|
||||
if (ngtcp2_crypto_quictls_init() != 0) {
|
||||
std::cerr << "ngtcp2_crypto_quictls_init failed" << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
# endif // defined(HAVE_LIBNGTCP2_CRYPTO_QUICTLS)
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_OSSL
|
||||
if (ngtcp2_crypto_ossl_init() != 0) {
|
||||
std::cerr << "ngtcp2_crypto_ossl_init failed" << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
# endif // defined(HAVE_LIBNGTCP2_CRYPTO_OSSL)
|
||||
#endif // defined(ENABLE_HTTP3)
|
||||
|
||||
auto ssl_ctx = SSL_CTX_new(TLS_client_method());
|
||||
if (!ssl_ctx) {
|
||||
std::cerr << "Failed to create SSL_CTX: "
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
|
||||
#include "ssl_compat.h"
|
||||
|
||||
#if defined(ENABLE_HTTP3) && OPENSSL_3_5_0_API
|
||||
# include <ngtcp2/ngtcp2_crypto_ossl.h>
|
||||
#endif // defined(ENABLE_HTTP3) && OPENSSL_3_5_0_API
|
||||
|
||||
#ifdef NGHTTP2_OPENSSL_IS_WOLFSSL
|
||||
# include <wolfssl/options.h>
|
||||
# include <wolfssl/openssl/ssl.h>
|
||||
@@ -354,6 +358,9 @@ struct Client {
|
||||
ev_timer pkt_timer;
|
||||
ngtcp2_conn *conn;
|
||||
ngtcp2_ccerr last_error;
|
||||
# if OPENSSL_3_5_0_API
|
||||
ngtcp2_crypto_ossl_ctx *ossl_ctx;
|
||||
# endif // OPENSSL_3_5_0_API
|
||||
bool close_requested;
|
||||
FILE *qlog_file;
|
||||
|
||||
|
||||
@@ -345,7 +345,22 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
||||
|
||||
SSL_set_app_data(ssl, &quic.conn_ref);
|
||||
SSL_set_connect_state(ssl);
|
||||
#if OPENSSL_3_5_0_API
|
||||
if (ngtcp2_crypto_ossl_configure_client_session(ssl) != 0) {
|
||||
std::cerr << "ngtcp2_crypto_ossl_configure_client_session failed"
|
||||
<< std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
rv = ngtcp2_crypto_ossl_ctx_new(&quic.ossl_ctx, ssl);
|
||||
if (rv != 0) {
|
||||
std::cerr << "ngtcp2_crypto_ossl_ctx_new failed with error code " << rv
|
||||
<< std::endl;
|
||||
return -1;
|
||||
}
|
||||
#else // !OPENSSL_3_5_0_API
|
||||
SSL_set_quic_use_legacy_codepoint(ssl, 0);
|
||||
#endif // !OPENSSL_3_5_0_API
|
||||
}
|
||||
|
||||
auto callbacks = ngtcp2_callbacks{
|
||||
@@ -465,12 +480,20 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if OPENSSL_3_5_0_API
|
||||
ngtcp2_conn_set_tls_native_handle(quic.conn, quic.ossl_ctx);
|
||||
#else // !OPENSSL_3_5_0_API
|
||||
ngtcp2_conn_set_tls_native_handle(quic.conn, ssl);
|
||||
#endif // !OPENSSL_3_5_0_API
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Client::quic_free() {
|
||||
#if OPENSSL_3_5_0_API
|
||||
ngtcp2_crypto_ossl_ctx_del(quic.ossl_ctx);
|
||||
#endif // OPENSSL_3_5_0_API
|
||||
|
||||
ngtcp2_conn_del(quic.conn);
|
||||
if (quic.qlog_file != nullptr) {
|
||||
fclose(quic.qlog_file);
|
||||
|
||||
23
src/shrpx.cc
23
src/shrpx.cc
@@ -92,7 +92,13 @@
|
||||
#ifdef ENABLE_HTTP3
|
||||
# include <ngtcp2/ngtcp2.h>
|
||||
# include <nghttp3/nghttp3.h>
|
||||
#endif // ENABLE_HTTP3
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_QUICTLS
|
||||
# include <ngtcp2/ngtcp2_crypto_quictls.h>
|
||||
# endif // HAVE_LIBNGTCP2_CRYPTO_QUICTLS
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_OSSL
|
||||
# include <ngtcp2/ngtcp2_crypto_ossl.h>
|
||||
# endif // HAVE_LIBNGTCP2_CRYPTO_OSSL
|
||||
#endif // ENABLE_HTTP3
|
||||
|
||||
#include "shrpx_config.h"
|
||||
#include "shrpx_tls.h"
|
||||
@@ -5306,6 +5312,21 @@ int main(int argc, char **argv) {
|
||||
cmdcfgs.emplace_back(SHRPX_OPT_CERTIFICATE_FILE, StringRef{argv[optind++]});
|
||||
}
|
||||
|
||||
#ifdef ENABLE_HTTP3
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_QUICTLS
|
||||
if (ngtcp2_crypto_quictls_init() != 0) {
|
||||
LOG(FATAL) << "ngtcp2_crypto_quictls_init failed";
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
# endif // defined(HAVE_LIBNGTCP2_CRYPTO_QUICTLS)
|
||||
# ifdef HAVE_LIBNGTCP2_CRYPTO_OSSL
|
||||
if (ngtcp2_crypto_ossl_init() != 0) {
|
||||
LOG(FATAL) << "ngtcp2_crypto_ossl_init failed";
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
# endif // defined(HAVE_LIBNGTCP2_CRYPTO_OSSL)
|
||||
#endif // defined(ENABLE_HTTP3)
|
||||
|
||||
rv = process_options(mod_config(), cmdcfgs);
|
||||
if (rv != 0) {
|
||||
return -1;
|
||||
|
||||
@@ -114,6 +114,9 @@ void Connection::disconnect() {
|
||||
SSL_shutdown(tls.ssl);
|
||||
}
|
||||
|
||||
// Unset app data here, so that ngtcp2_conn never be used by
|
||||
// libngtcp2_crypto_ossl that may be called by SSL_free.
|
||||
SSL_set_app_data(tls.ssl, NULL);
|
||||
SSL_free(tls.ssl);
|
||||
tls.ssl = nullptr;
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
#endif // HAVE_MRUBY
|
||||
#include "http3.h"
|
||||
#include "util.h"
|
||||
#include "ssl_compat.h"
|
||||
|
||||
namespace shrpx {
|
||||
|
||||
@@ -115,6 +114,9 @@ Http3Upstream::Http3Upstream(ClientHandler *handler)
|
||||
qlog_fd_{-1},
|
||||
hashed_scid_{},
|
||||
conn_{nullptr},
|
||||
#if OPENSSL_3_5_0_API
|
||||
ossl_ctx_{nullptr},
|
||||
#endif // OPENSSL_3_5_0_API,
|
||||
httpconn_{nullptr},
|
||||
downstream_queue_{downstream_queue_size(handler->get_worker()),
|
||||
!get_config()->http2_proxy},
|
||||
@@ -149,6 +151,10 @@ Http3Upstream::~Http3Upstream() {
|
||||
|
||||
nghttp3_conn_del(httpconn_);
|
||||
|
||||
#if OPENSSL_3_5_0_API
|
||||
ngtcp2_crypto_ossl_ctx_del(ossl_ctx_);
|
||||
#endif // OPENSSL_3_5_0_API
|
||||
|
||||
ngtcp2_conn_del(conn_);
|
||||
|
||||
if (qlog_fd_ != -1) {
|
||||
@@ -734,7 +740,26 @@ int Http3Upstream::init(const UpstreamAddr *faddr, const Address &remote_addr,
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if OPENSSL_3_5_0_API
|
||||
auto ssl = handler_->get_ssl();
|
||||
|
||||
rv = ngtcp2_crypto_ossl_configure_server_session(ssl);
|
||||
if (rv != 0) {
|
||||
ULOG(ERROR, this) << "ngtcp2_crypto_ossl_configure_server_session failed";
|
||||
return -1;
|
||||
}
|
||||
|
||||
rv = ngtcp2_crypto_ossl_ctx_new(&ossl_ctx_, ssl);
|
||||
if (rv != 0) {
|
||||
ULOG(ERROR, this) << "ngtcp2_crypto_ossl_ctx_new failed with error code "
|
||||
<< rv;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ngtcp2_conn_set_tls_native_handle(conn_, ossl_ctx_);
|
||||
#else // !OPENSSL_3_5_0_API
|
||||
ngtcp2_conn_set_tls_native_handle(conn_, handler_->get_ssl());
|
||||
#endif // !OPENSSL_3_5_0_API
|
||||
|
||||
auto quic_connection_handler = worker->get_quic_connection_handler();
|
||||
|
||||
|
||||
@@ -34,6 +34,11 @@
|
||||
#include "shrpx_downstream_queue.h"
|
||||
#include "quic.h"
|
||||
#include "network.h"
|
||||
#include "ssl_compat.h"
|
||||
|
||||
#if defined(ENABLE_HTTP3) && OPENSSL_3_5_0_API
|
||||
# include <ngtcp2/ngtcp2_crypto_ossl.h>
|
||||
#endif // defined(ENABLE_HTTP3) && OPENSSL_3_5_0_API
|
||||
|
||||
using namespace nghttp2;
|
||||
|
||||
@@ -165,6 +170,9 @@ private:
|
||||
ngtcp2_cid hashed_scid_;
|
||||
ngtcp2_conn *conn_;
|
||||
ngtcp2_ccerr last_error_;
|
||||
#if OPENSSL_3_5_0_API
|
||||
ngtcp2_crypto_ossl_ctx *ossl_ctx_;
|
||||
#endif // OPENSSL_3_5_0_API
|
||||
nghttp3_conn *httpconn_;
|
||||
DownstreamQueue downstream_queue_;
|
||||
std::vector<uint8_t> conn_close_;
|
||||
|
||||
@@ -388,7 +388,8 @@ ClientHandler *QUICConnectionHandler::handle_new_connection(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#if defined(NGHTTP2_GENUINE_OPENSSL) || defined(NGHTTP2_OPENSSL_IS_WOLFSSL)
|
||||
#if !OPENSSL_3_5_0_API && \
|
||||
(defined(NGHTTP2_GENUINE_OPENSSL) || defined(NGHTTP2_OPENSSL_IS_WOLFSSL))
|
||||
assert(SSL_is_quic(ssl));
|
||||
#endif // NGHTTP2_GENUINE_OPENSSL || NGHTTP2_OPENSSL_IS_WOLFSSL
|
||||
|
||||
@@ -398,7 +399,9 @@ ClientHandler *QUICConnectionHandler::handle_new_connection(
|
||||
auto &quicconf = config->quic;
|
||||
|
||||
if (quicconf.upstream.early_data) {
|
||||
#if defined(NGHTTP2_GENUINE_OPENSSL) || \
|
||||
#if OPENSSL_3_5_0_API
|
||||
SSL_set_quic_tls_early_data_enabled(ssl, 1);
|
||||
#elif defined(NGHTTP2_GENUINE_OPENSSL) || \
|
||||
(defined(NGHTTP2_OPENSSL_IS_WOLFSSL) && defined(WOLFSSL_EARLY_DATA))
|
||||
SSL_set_quic_early_data_enabled(ssl, 1);
|
||||
#elif defined(NGHTTP2_OPENSSL_IS_BORINGSSL)
|
||||
|
||||
@@ -47,8 +47,10 @@
|
||||
|
||||
# ifdef NGHTTP2_GENUINE_OPENSSL
|
||||
# define OPENSSL_3_0_0_API (OPENSSL_VERSION_NUMBER >= 0x30000000L)
|
||||
# define OPENSSL_3_5_0_API (OPENSSL_VERSION_NUMBER >= 0x30500000L)
|
||||
# else // !NGHTTP2_GENUINE_OPENSSL
|
||||
# define OPENSSL_3_0_0_API 0
|
||||
# define OPENSSL_3_5_0_API 0
|
||||
# endif // !NGHTTP2_GENUINE_OPENSSL
|
||||
#endif // !HAVE_WOLFSSL
|
||||
|
||||
|
||||
Reference in New Issue
Block a user