curl: support embedding a CA bundle
Add the ability to embed a CA bundle into the curl binary. It is used when no other runtime or build-time option set one. This helps curl-for-win macOS and Linux builds to run standalone, and also helps Windows builds to avoid picking up the CA bundle from an arbitrary (possibly world-writable) location (though this behaviour is not currently disablable). Usage: - cmake: `-DCURL_CA_EMBED=/path/to/curl-ca-bundle.crt` - autotools: `--with-ca-embed=/path/to/curl-ca-bundle.crt` - Makefile.mk: `CURL_CA_EMBED=/path/to/curl-ca-bundle.crt` Also add new command-line option `--dump-ca-embed` to dump the embedded CA bundle to standard output. Closes #14059
This commit is contained in:
parent
87aa4ebd82
commit
8a3740bc8e
@ -1133,6 +1133,8 @@ if(curl_ca_bundle_supported)
|
|||||||
"Set ON to use built-in CA store of TLS backend. Defaults to OFF")
|
"Set ON to use built-in CA store of TLS backend. Defaults to OFF")
|
||||||
set(CURL_CA_PATH "auto" CACHE STRING
|
set(CURL_CA_PATH "auto" CACHE STRING
|
||||||
"Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
|
"Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
|
||||||
|
set(CURL_CA_EMBED "" CACHE STRING
|
||||||
|
"Path to the CA bundle to embed into the curl tool.")
|
||||||
|
|
||||||
if(CURL_CA_BUNDLE STREQUAL "")
|
if(CURL_CA_BUNDLE STREQUAL "")
|
||||||
message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.")
|
message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.")
|
||||||
@ -1196,6 +1198,15 @@ if(curl_ca_bundle_supported)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(CURL_CA_EMBED_SET FALSE)
|
||||||
|
if(BUILD_CURL_EXE AND NOT CURL_CA_EMBED STREQUAL "")
|
||||||
|
if(EXISTS "${CURL_CA_EMBED}")
|
||||||
|
set(CURL_CA_EMBED_SET TRUE)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "CA bundle to embed is missing: '${CURL_CA_EMBED}'")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for header files
|
# Check for header files
|
||||||
@ -1798,6 +1809,7 @@ if(NOT CURL_DISABLE_INSTALL)
|
|||||||
_add_if("TrackMemory" ENABLE_CURLDEBUG)
|
_add_if("TrackMemory" ENABLE_CURLDEBUG)
|
||||||
_add_if("ECH" SSL_ENABLED AND HAVE_ECH)
|
_add_if("ECH" SSL_ENABLED AND HAVE_ECH)
|
||||||
_add_if("PSL" USE_LIBPSL)
|
_add_if("PSL" USE_LIBPSL)
|
||||||
|
_add_if("CAcert" CURL_CA_EMBED_SET)
|
||||||
if(_items)
|
if(_items)
|
||||||
if(NOT CMAKE_VERSION VERSION_LESS 3.13)
|
if(NOT CMAKE_VERSION VERSION_LESS 3.13)
|
||||||
list(SORT _items CASE INSENSITIVE)
|
list(SORT _items CASE INSENSITIVE)
|
||||||
|
|||||||
31
acinclude.m4
31
acinclude.m4
@ -1357,6 +1357,37 @@ AS_HELP_STRING([--without-ca-fallback], [Don't use the built in CA store of the
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_CA_EMBED
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check if a ca-bundle should be embedded
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_CA_EMBED], [
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([CA cert bundle path to embed])
|
||||||
|
|
||||||
|
AC_ARG_WITH(ca-embed,
|
||||||
|
AS_HELP_STRING([--with-ca-embed=FILE],
|
||||||
|
[Path to a file containing CA certificates (example: /etc/ca-bundle.crt)])
|
||||||
|
AS_HELP_STRING([--without-ca-embed], [Don't embed a default CA bundle]),
|
||||||
|
[
|
||||||
|
want_ca_embed="$withval"
|
||||||
|
if test "x$want_ca_embed" = "xyes"; then
|
||||||
|
AC_MSG_ERROR([--with-ca-embed=FILE requires a path to the CA bundle])
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[ want_ca_embed="unset" ])
|
||||||
|
|
||||||
|
CURL_CA_EMBED=''
|
||||||
|
if test "x$want_ca_embed" != "xno" -a "x$want_ca_embed" != "xunset" -a -f "$want_ca_embed"; then
|
||||||
|
CURL_CA_EMBED='"'$want_ca_embed'"'
|
||||||
|
AC_SUBST(CURL_CA_EMBED)
|
||||||
|
AC_MSG_RESULT([$want_ca_embed])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
dnl CURL_CHECK_WIN32_LARGEFILE
|
dnl CURL_CHECK_WIN32_LARGEFILE
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Check if curl's WIN32 large file will be used
|
dnl Check if curl's WIN32 large file will be used
|
||||||
|
|||||||
10
configure.ac
10
configure.ac
@ -2090,8 +2090,11 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
if test -n "$check_for_ca_bundle"; then
|
if test -n "$check_for_ca_bundle"; then
|
||||||
CURL_CHECK_CA_BUNDLE
|
CURL_CHECK_CA_BUNDLE
|
||||||
|
CURL_CHECK_CA_EMBED
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL(CURL_CA_EMBED_SET, test "x$CURL_CA_EMBED" != "x")
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for libpsl
|
dnl Check for libpsl
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@ -3844,13 +3847,13 @@ AC_CHECK_DECL([fseeko],
|
|||||||
|
|
||||||
CURL_CHECK_NONBLOCKING_SOCKET
|
CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
|
|
||||||
if test "x$BUILD_DOCS" != "x0" -o "x$USE_MANUAL" != "x0"; then
|
if test "x$BUILD_DOCS" != "x0" -o "x$USE_MANUAL" != "x0" -o "x$CURL_CA_EMBED" != "x"; then
|
||||||
AC_PATH_PROG( PERL, perl, ,
|
AC_PATH_PROG( PERL, perl, ,
|
||||||
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
||||||
AC_SUBST(PERL)
|
AC_SUBST(PERL)
|
||||||
|
|
||||||
if test -z "$PERL"; then
|
if test -z "$PERL"; then
|
||||||
AC_MSG_ERROR([perl was not found, needed for docs and manual])
|
AC_MSG_ERROR([perl was not found, needed for docs, manual and CA embed])
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -4866,6 +4869,9 @@ fi
|
|||||||
if test "x$want_curldebug" = "xyes"; then
|
if test "x$want_curldebug" = "xyes"; then
|
||||||
SUPPORT_FEATURES="$SUPPORT_FEATURES TrackMemory"
|
SUPPORT_FEATURES="$SUPPORT_FEATURES TrackMemory"
|
||||||
fi
|
fi
|
||||||
|
if test "x$CURL_CA_EMBED" != "x"; then
|
||||||
|
SUPPORT_FEATURES="$SUPPORT_FEATURES CAcert"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl replace spaces with newlines
|
dnl replace spaces with newlines
|
||||||
dnl sort the lines
|
dnl sort the lines
|
||||||
|
|||||||
@ -89,6 +89,7 @@ DPAGES = \
|
|||||||
doh-cert-status.md \
|
doh-cert-status.md \
|
||||||
doh-insecure.md \
|
doh-insecure.md \
|
||||||
doh-url.md \
|
doh-url.md \
|
||||||
|
dump-ca-embed.md \
|
||||||
dump-header.md \
|
dump-header.md \
|
||||||
ech.md \
|
ech.md \
|
||||||
egd-file.md \
|
egd-file.md \
|
||||||
|
|||||||
@ -10,6 +10,7 @@ Multi: boolean
|
|||||||
See-also:
|
See-also:
|
||||||
- cacert
|
- cacert
|
||||||
- capath
|
- capath
|
||||||
|
- dump-ca-embed
|
||||||
- insecure
|
- insecure
|
||||||
Example:
|
Example:
|
||||||
- --ca-native $URL
|
- --ca-native $URL
|
||||||
|
|||||||
@ -10,6 +10,7 @@ Added: 7.5
|
|||||||
Multi: single
|
Multi: single
|
||||||
See-also:
|
See-also:
|
||||||
- capath
|
- capath
|
||||||
|
- dump-ca-embed
|
||||||
- insecure
|
- insecure
|
||||||
Example:
|
Example:
|
||||||
- --cacert CA-file.txt $URL
|
- --cacert CA-file.txt $URL
|
||||||
|
|||||||
@ -10,6 +10,7 @@ Added: 7.9.8
|
|||||||
Multi: single
|
Multi: single
|
||||||
See-also:
|
See-also:
|
||||||
- cacert
|
- cacert
|
||||||
|
- dump-ca-embed
|
||||||
- insecure
|
- insecure
|
||||||
Example:
|
Example:
|
||||||
- --capath /local/directory $URL
|
- --capath /local/directory $URL
|
||||||
|
|||||||
25
docs/cmdline-opts/dump-ca-embed.md
Normal file
25
docs/cmdline-opts/dump-ca-embed.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
SPDX-License-Identifier: curl
|
||||||
|
Long: dump-ca-embed
|
||||||
|
Help: Write the embedded CA bundle to standard output
|
||||||
|
Protocols: TLS
|
||||||
|
Category: http proxy tls
|
||||||
|
Added: 8.10.0
|
||||||
|
Multi: single
|
||||||
|
See-also:
|
||||||
|
- ca-native
|
||||||
|
- cacert
|
||||||
|
- capath
|
||||||
|
- proxy-ca-native
|
||||||
|
- proxy-cacert
|
||||||
|
- proxy-capath
|
||||||
|
Example:
|
||||||
|
- --dump-ca-embed
|
||||||
|
---
|
||||||
|
|
||||||
|
# `--dump-ca-embed`
|
||||||
|
|
||||||
|
Write the CA bundle embedded in curl to standard output, then quit.
|
||||||
|
|
||||||
|
If curl was not built with a default CA bundle embedded, the output is empty.
|
||||||
@ -10,6 +10,7 @@ Multi: boolean
|
|||||||
See-also:
|
See-also:
|
||||||
- cacert
|
- cacert
|
||||||
- capath
|
- capath
|
||||||
|
- dump-ca-embed
|
||||||
- insecure
|
- insecure
|
||||||
Example:
|
Example:
|
||||||
- --proxy-ca-native $URL
|
- --proxy-ca-native $URL
|
||||||
|
|||||||
@ -11,6 +11,7 @@ See-also:
|
|||||||
- proxy-capath
|
- proxy-capath
|
||||||
- cacert
|
- cacert
|
||||||
- capath
|
- capath
|
||||||
|
- dump-ca-embed
|
||||||
- proxy
|
- proxy
|
||||||
Example:
|
Example:
|
||||||
- --proxy-cacert CA-file.txt -x https://proxy $URL
|
- --proxy-cacert CA-file.txt -x https://proxy $URL
|
||||||
|
|||||||
@ -11,6 +11,7 @@ See-also:
|
|||||||
- proxy-cacert
|
- proxy-cacert
|
||||||
- proxy
|
- proxy
|
||||||
- capath
|
- capath
|
||||||
|
- dump-ca-embed
|
||||||
Example:
|
Example:
|
||||||
- --proxy-capath /local/directory -x https://proxy $URL
|
- --proxy-capath /local/directory -x https://proxy $URL
|
||||||
---
|
---
|
||||||
|
|||||||
@ -54,6 +54,7 @@
|
|||||||
--doh-cert-status 7.76.0
|
--doh-cert-status 7.76.0
|
||||||
--doh-insecure 7.76.0
|
--doh-insecure 7.76.0
|
||||||
--doh-url 7.62.0
|
--doh-url 7.62.0
|
||||||
|
--dump-ca-embed 8.10.0
|
||||||
--dump-header (-D) 5.7
|
--dump-header (-D) 5.7
|
||||||
--ech 8.8.0
|
--ech 8.8.0
|
||||||
--egd-file 7.7
|
--egd-file 7.7
|
||||||
|
|||||||
@ -115,7 +115,7 @@ rem ***************************************************************************
|
|||||||
if "%CHECK_SRC%" == "TRUE" (
|
if "%CHECK_SRC%" == "TRUE" (
|
||||||
rem Check the src directory
|
rem Check the src directory
|
||||||
if exist %SRC_DIR%\src (
|
if exist %SRC_DIR%\src (
|
||||||
for /f "delims=" %%i in ('dir "%SRC_DIR%\src\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\scripts\checksrc.pl" "-D%SRC_DIR%\src" -Wtool_hugehelp.c "%%i"
|
for /f "delims=" %%i in ('dir "%SRC_DIR%\src\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\scripts\checksrc.pl" "-D%SRC_DIR%\src" -Wtool_ca_embed.c -Wtool_hugehelp.c "%%i"
|
||||||
for /f "delims=" %%i in ('dir "%SRC_DIR%\src\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\scripts\checksrc.pl" "-D%SRC_DIR%\src" "%%i"
|
for /f "delims=" %%i in ('dir "%SRC_DIR%\src\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\scripts\checksrc.pl" "-D%SRC_DIR%\src" "%%i"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
1
src/.gitignore
vendored
1
src/.gitignore
vendored
@ -10,5 +10,6 @@ curl
|
|||||||
curl_config.h
|
curl_config.h
|
||||||
curl_config.h.in
|
curl_config.h.in
|
||||||
stamp-h2
|
stamp-h2
|
||||||
|
tool_ca_embed.c
|
||||||
tool_hugehelp.c
|
tool_hugehelp.c
|
||||||
tool_version.h.dist
|
tool_version.h.dist
|
||||||
|
|||||||
@ -54,6 +54,22 @@ endif()
|
|||||||
transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
|
transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
|
||||||
include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake)
|
include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake)
|
||||||
|
|
||||||
|
if(CURL_CA_EMBED_SET)
|
||||||
|
if(PERL_FOUND)
|
||||||
|
add_definitions("-DCURL_CA_EMBED")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT tool_ca_embed.c
|
||||||
|
COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mk-file-embed.pl" --var curl_ca_embed < "${CURL_CA_EMBED}" > tool_ca_embed.c
|
||||||
|
DEPENDS
|
||||||
|
"${CURL_CA_EMBED}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/mk-file-embed.pl"
|
||||||
|
VERBATIM)
|
||||||
|
list(APPEND CURL_CFILES tool_ca_embed.c)
|
||||||
|
else()
|
||||||
|
message(WARNING "Perl not found. Will not embed the CA bundle.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
list(APPEND CURL_CFILES curl.rc)
|
list(APPEND CURL_CFILES curl.rc)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -88,7 +88,7 @@ CLEANFILES = tool_hugehelp.c
|
|||||||
# embedded text.
|
# embedded text.
|
||||||
NROFF=env LC_ALL=C @NROFF@ @MANOPT@ 2>/dev/null # figured out by the configure script
|
NROFF=env LC_ALL=C @NROFF@ @MANOPT@ 2>/dev/null # figured out by the configure script
|
||||||
|
|
||||||
EXTRA_DIST = mkhelp.pl \
|
EXTRA_DIST = mk-file-embed.pl mkhelp.pl \
|
||||||
Makefile.mk curl.rc Makefile.inc CMakeLists.txt .checksrc
|
Makefile.mk curl.rc Makefile.inc CMakeLists.txt .checksrc
|
||||||
|
|
||||||
# Use absolute directory to disable VPATH
|
# Use absolute directory to disable VPATH
|
||||||
@ -135,11 +135,25 @@ $(HUGE):
|
|||||||
echo '#include "tool_hugehelp.h"' >> $(HUGE)
|
echo '#include "tool_hugehelp.h"' >> $(HUGE)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# ignore tool_hugehelp.c since it is generated source code and it plays
|
CA_EMBED_CSOURCE = tool_ca_embed.c
|
||||||
# by slightly different rules!
|
CURL_CFILES += $(CA_EMBED_CSOURCE)
|
||||||
|
CLEANFILES += $(CA_EMBED_CSOURCE)
|
||||||
|
if CURL_CA_EMBED_SET
|
||||||
|
AM_CPPFLAGS += -DCURL_CA_EMBED
|
||||||
|
MK_FILE_EMBED = $(top_srcdir)/src/mk-file-embed.pl
|
||||||
|
$(CA_EMBED_CSOURCE): $(MK_FILE_EMBED)
|
||||||
|
$(PERL) $(MK_FILE_EMBED) --var curl_ca_embed < $(CURL_CA_EMBED) > $(CA_EMBED_CSOURCE)
|
||||||
|
else
|
||||||
|
$(CA_EMBED_CSOURCE):
|
||||||
|
echo 'extern const void *curl_ca_embed; const void *curl_ca_embed;' > $(CA_EMBED_CSOURCE)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ignore generated C files since they play by slightly different rules!
|
||||||
checksrc:
|
checksrc:
|
||||||
$(CHECKSRC)(@PERL@ $(top_srcdir)/scripts/checksrc.pl -D$(srcdir) \
|
$(CHECKSRC)(@PERL@ $(top_srcdir)/scripts/checksrc.pl -D$(srcdir) \
|
||||||
-W$(srcdir)/tool_hugehelp.c $(srcdir)/*.[ch])
|
-W$(srcdir)/$(HUGE) \
|
||||||
|
-W$(srcdir)/$(CA_EMBED_CSOURCE) \
|
||||||
|
$(srcdir)/*.[ch])
|
||||||
|
|
||||||
if DEBUGBUILD
|
if DEBUGBUILD
|
||||||
# for debug builds, we scan the sources on all regular make invokes
|
# for debug builds, we scan the sources on all regular make invokes
|
||||||
|
|||||||
@ -45,6 +45,11 @@ TARGETS := curl$(BIN_EXT)
|
|||||||
|
|
||||||
CURL_CFILES += $(notdir $(CURLX_CFILES))
|
CURL_CFILES += $(notdir $(CURLX_CFILES))
|
||||||
|
|
||||||
|
ifneq ($(CURL_CA_EMBED),)
|
||||||
|
CPPFLAGS += -DCURL_CA_EMBED
|
||||||
|
CURL_CFILES += tool_ca_embed.c
|
||||||
|
endif
|
||||||
|
|
||||||
curl_OBJECTS := $(patsubst %.c,$(OBJ_DIR)/%.o,$(strip $(CURL_CFILES)))
|
curl_OBJECTS := $(patsubst %.c,$(OBJ_DIR)/%.o,$(strip $(CURL_CFILES)))
|
||||||
ifdef MAP
|
ifdef MAP
|
||||||
CURL_MAP := curl.map
|
CURL_MAP := curl.map
|
||||||
@ -57,8 +62,9 @@ TOCLEAN := $(curl_OBJECTS)
|
|||||||
|
|
||||||
### Rules
|
### Rules
|
||||||
|
|
||||||
ifneq ($(wildcard tool_hugehelp.c.cvs),)
|
|
||||||
PERL ?= perl
|
PERL ?= perl
|
||||||
|
|
||||||
|
ifneq ($(wildcard tool_hugehelp.c.cvs),)
|
||||||
NROFF ?= groff
|
NROFF ?= groff
|
||||||
|
|
||||||
TOCLEAN += tool_hugehelp.c
|
TOCLEAN += tool_hugehelp.c
|
||||||
@ -84,6 +90,12 @@ tool_hugehelp.c:
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(CURL_CA_EMBED),)
|
||||||
|
TOCLEAN += tool_ca_embed.c
|
||||||
|
tool_ca_embed.c: mk-file-embed.pl
|
||||||
|
$(PERL) mk-file-embed.pl --var curl_ca_embed < $(CURL_CA_EMBED) > $@
|
||||||
|
endif
|
||||||
|
|
||||||
$(TARGETS): $(curl_OBJECTS) $(PROOT)/lib/libcurl.a
|
$(TARGETS): $(curl_OBJECTS) $(PROOT)/lib/libcurl.a
|
||||||
$(CC) $(LDFLAGS) -o $@ $(curl_OBJECTS) $(LIBS)
|
$(CC) $(LDFLAGS) -o $@ $(curl_OBJECTS) $(LIBS)
|
||||||
|
|
||||||
|
|||||||
56
src/mk-file-embed.pl
Executable file
56
src/mk-file-embed.pl
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
#***************************************************************************
|
||||||
|
# _ _ ____ _
|
||||||
|
# Project ___| | | | _ \| |
|
||||||
|
# / __| | | | |_) | |
|
||||||
|
# | (__| |_| | _ <| |___
|
||||||
|
# \___|\___/|_| \_\_____|
|
||||||
|
#
|
||||||
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
#
|
||||||
|
# This software is licensed as described in the file COPYING, which
|
||||||
|
# you should have received as part of this distribution. The terms
|
||||||
|
# are also available at https://curl.se/docs/copyright.html.
|
||||||
|
#
|
||||||
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
# copies of the Software, and permit persons to whom the Software is
|
||||||
|
# furnished to do so, under the terms of the COPYING file.
|
||||||
|
#
|
||||||
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
# KIND, either express or implied.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: curl
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
my $varname = "var";
|
||||||
|
if($ARGV[0] eq "--var") {
|
||||||
|
shift;
|
||||||
|
$varname = shift @ARGV;
|
||||||
|
}
|
||||||
|
|
||||||
|
print <<HEAD
|
||||||
|
/*
|
||||||
|
* NEVER EVER edit this manually, fix the mk-file-embed.pl script instead!
|
||||||
|
*/
|
||||||
|
extern const unsigned char ${varname}[];
|
||||||
|
const unsigned char ${varname}[] = {
|
||||||
|
HEAD
|
||||||
|
;
|
||||||
|
|
||||||
|
while (<STDIN>) {
|
||||||
|
my $line = $_;
|
||||||
|
foreach my $n (split //, $line) {
|
||||||
|
my $ord = ord($n);
|
||||||
|
printf("%s,", $ord);
|
||||||
|
if($ord == 10) {
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print <<ENDLINE
|
||||||
|
0
|
||||||
|
};
|
||||||
|
ENDLINE
|
||||||
|
;
|
||||||
@ -122,6 +122,7 @@ typedef enum {
|
|||||||
C_DOH_CERT_STATUS,
|
C_DOH_CERT_STATUS,
|
||||||
C_DOH_INSECURE,
|
C_DOH_INSECURE,
|
||||||
C_DOH_URL,
|
C_DOH_URL,
|
||||||
|
C_DUMP_CA_EMBED,
|
||||||
C_DUMP_HEADER,
|
C_DUMP_HEADER,
|
||||||
C_ECH,
|
C_ECH,
|
||||||
C_EGD_FILE,
|
C_EGD_FILE,
|
||||||
@ -408,6 +409,7 @@ static const struct LongShort aliases[]= {
|
|||||||
{"doh-cert-status", ARG_BOOL, ' ', C_DOH_CERT_STATUS},
|
{"doh-cert-status", ARG_BOOL, ' ', C_DOH_CERT_STATUS},
|
||||||
{"doh-insecure", ARG_BOOL, ' ', C_DOH_INSECURE},
|
{"doh-insecure", ARG_BOOL, ' ', C_DOH_INSECURE},
|
||||||
{"doh-url" , ARG_STRG, ' ', C_DOH_URL},
|
{"doh-url" , ARG_STRG, ' ', C_DOH_URL},
|
||||||
|
{"dump-ca-embed", ARG_NONE, ' ', C_DUMP_CA_EMBED},
|
||||||
{"dump-header", ARG_FILE, 'D', C_DUMP_HEADER},
|
{"dump-header", ARG_FILE, 'D', C_DUMP_HEADER},
|
||||||
{"ech", ARG_STRG, ' ', C_ECH},
|
{"ech", ARG_STRG, ' ', C_ECH},
|
||||||
{"egd-file", ARG_STRG, ' ', C_EGD_FILE},
|
{"egd-file", ARG_STRG, ' ', C_EGD_FILE},
|
||||||
@ -2113,6 +2115,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
|
|||||||
case C_URL_QUERY: /* --url-query */
|
case C_URL_QUERY: /* --url-query */
|
||||||
err = url_query(nextarg, global, config);
|
err = url_query(nextarg, global, config);
|
||||||
break;
|
break;
|
||||||
|
case C_DUMP_CA_EMBED: /* --dump-ca-embed */
|
||||||
|
err = PARAM_CA_EMBED_REQUESTED;
|
||||||
|
break;
|
||||||
case C_DUMP_HEADER: /* --dump-header */
|
case C_DUMP_HEADER: /* --dump-header */
|
||||||
err = getstr(&config->headerfile, nextarg, DENY_BLANK);
|
err = getstr(&config->headerfile, nextarg, DENY_BLANK);
|
||||||
break;
|
break;
|
||||||
@ -2984,7 +2989,8 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
|
|||||||
if(result && result != PARAM_HELP_REQUESTED &&
|
if(result && result != PARAM_HELP_REQUESTED &&
|
||||||
result != PARAM_MANUAL_REQUESTED &&
|
result != PARAM_MANUAL_REQUESTED &&
|
||||||
result != PARAM_VERSION_INFO_REQUESTED &&
|
result != PARAM_VERSION_INFO_REQUESTED &&
|
||||||
result != PARAM_ENGINES_REQUESTED) {
|
result != PARAM_ENGINES_REQUESTED &&
|
||||||
|
result != PARAM_CA_EMBED_REQUESTED) {
|
||||||
const char *reason = param2text(result);
|
const char *reason = param2text(result);
|
||||||
|
|
||||||
if(orig_opt && strcmp(":", orig_opt))
|
if(orig_opt && strcmp(":", orig_opt))
|
||||||
|
|||||||
@ -35,6 +35,7 @@ typedef enum {
|
|||||||
PARAM_MANUAL_REQUESTED,
|
PARAM_MANUAL_REQUESTED,
|
||||||
PARAM_VERSION_INFO_REQUESTED,
|
PARAM_VERSION_INFO_REQUESTED,
|
||||||
PARAM_ENGINES_REQUESTED,
|
PARAM_ENGINES_REQUESTED,
|
||||||
|
PARAM_CA_EMBED_REQUESTED,
|
||||||
PARAM_GOT_EXTRA_PARAMETER,
|
PARAM_GOT_EXTRA_PARAMETER,
|
||||||
PARAM_BAD_NUMERIC,
|
PARAM_BAD_NUMERIC,
|
||||||
PARAM_NEGATIVE_NUMERIC,
|
PARAM_NEGATIVE_NUMERIC,
|
||||||
|
|||||||
@ -244,10 +244,28 @@ void tool_version_info(void)
|
|||||||
puts(""); /* newline */
|
puts(""); /* newline */
|
||||||
}
|
}
|
||||||
if(feature_names[0]) {
|
if(feature_names[0]) {
|
||||||
printf("Features:");
|
const char **feat_ext;
|
||||||
for(builtin = feature_names; *builtin; ++builtin)
|
size_t feat_ext_count = feature_count;
|
||||||
printf(" %s", *builtin);
|
#ifdef CURL_CA_EMBED
|
||||||
puts(""); /* newline */
|
++feat_ext_count;
|
||||||
|
#endif
|
||||||
|
feat_ext = malloc(sizeof(*feature_names) * (feat_ext_count + 1));
|
||||||
|
if(feat_ext) {
|
||||||
|
memcpy((void *)feat_ext, feature_names,
|
||||||
|
sizeof(*feature_names) * feature_count);
|
||||||
|
feat_ext_count = feature_count;
|
||||||
|
#ifdef CURL_CA_EMBED
|
||||||
|
feat_ext[feat_ext_count++] = "CAcert";
|
||||||
|
#endif
|
||||||
|
feat_ext[feat_ext_count] = NULL;
|
||||||
|
qsort((void *)feat_ext, feat_ext_count, sizeof(*feat_ext),
|
||||||
|
struplocompare4sort);
|
||||||
|
printf("Features:");
|
||||||
|
for(builtin = feat_ext; *builtin; ++builtin)
|
||||||
|
printf(" %s", *builtin);
|
||||||
|
puts(""); /* newline */
|
||||||
|
free((void *)feat_ext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(strcmp(CURL_VERSION, curlinfo->version)) {
|
if(strcmp(CURL_VERSION, curlinfo->version)) {
|
||||||
printf("WARNING: curl and libcurl versions do not match. "
|
printf("WARNING: curl and libcurl versions do not match. "
|
||||||
|
|||||||
@ -124,6 +124,7 @@ static struct feature_name_presentp {
|
|||||||
|
|
||||||
static const char *fnames[sizeof(maybe_feature) / sizeof(maybe_feature[0])];
|
static const char *fnames[sizeof(maybe_feature) / sizeof(maybe_feature[0])];
|
||||||
const char * const *feature_names = fnames;
|
const char * const *feature_names = fnames;
|
||||||
|
size_t feature_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* libcurl_info_init: retrieves runtime information about libcurl,
|
* libcurl_info_init: retrieves runtime information about libcurl,
|
||||||
@ -182,6 +183,7 @@ CURLcode get_libcurl_info(void)
|
|||||||
*p->feature_presentp = TRUE;
|
*p->feature_presentp = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
++feature_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|||||||
@ -34,6 +34,7 @@ extern const char * const *built_in_protos;
|
|||||||
extern size_t proto_count;
|
extern size_t proto_count;
|
||||||
|
|
||||||
extern const char * const *feature_names;
|
extern const char * const *feature_names;
|
||||||
|
extern size_t feature_count;
|
||||||
|
|
||||||
extern const char *proto_file;
|
extern const char *proto_file;
|
||||||
extern const char *proto_ftp;
|
extern const char *proto_ftp;
|
||||||
|
|||||||
@ -165,6 +165,9 @@ const struct helptxt helptext[] = {
|
|||||||
{" --doh-url <URL>",
|
{" --doh-url <URL>",
|
||||||
"Resolve hostnames over DoH",
|
"Resolve hostnames over DoH",
|
||||||
CURLHELP_DNS},
|
CURLHELP_DNS},
|
||||||
|
{" --dump-ca-embed",
|
||||||
|
"Write the embedded CA bundle to standard output",
|
||||||
|
CURLHELP_HTTP | CURLHELP_PROXY | CURLHELP_TLS},
|
||||||
{"-D, --dump-header <filename>",
|
{"-D, --dump-header <filename>",
|
||||||
"Write the received headers to <filename>",
|
"Write the received headers to <filename>",
|
||||||
CURLHELP_HTTP | CURLHELP_FTP},
|
CURLHELP_HTTP | CURLHELP_FTP},
|
||||||
|
|||||||
@ -94,6 +94,10 @@
|
|||||||
|
|
||||||
#include "memdebug.h" /* keep this as LAST include */
|
#include "memdebug.h" /* keep this as LAST include */
|
||||||
|
|
||||||
|
#ifdef CURL_CA_EMBED
|
||||||
|
extern const unsigned char curl_ca_embed[];
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef O_BINARY
|
#ifndef O_BINARY
|
||||||
/* since O_BINARY as used in bitmasks, setting it to zero makes it usable in
|
/* since O_BINARY as used in bitmasks, setting it to zero makes it usable in
|
||||||
source code but yet it does not ruin anything */
|
source code but yet it does not ruin anything */
|
||||||
@ -1657,6 +1661,37 @@ static CURLcode single_transfer(struct GlobalConfig *global,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CURL_CA_EMBED
|
||||||
|
if(!config->cacert && !config->capath) {
|
||||||
|
struct curl_blob blob;
|
||||||
|
blob.data = (void *)curl_ca_embed;
|
||||||
|
blob.len = strlen((const char *)curl_ca_embed);
|
||||||
|
blob.flags = CURL_BLOB_NOCOPY;
|
||||||
|
notef(config->global,
|
||||||
|
"Using embedded CA bundle (%zu bytes)",
|
||||||
|
blob.len);
|
||||||
|
result = curl_easy_setopt(curl, CURLOPT_CAINFO_BLOB, &blob);
|
||||||
|
if(result == CURLE_NOT_BUILT_IN) {
|
||||||
|
warnf(global,
|
||||||
|
"ignoring embedded CA bundle, not supported by libcurl");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!config->proxy_cacert && !config->proxy_capath) {
|
||||||
|
struct curl_blob blob;
|
||||||
|
blob.data = (void *)curl_ca_embed;
|
||||||
|
blob.len = strlen((const char *)curl_ca_embed);
|
||||||
|
blob.flags = CURL_BLOB_NOCOPY;
|
||||||
|
notef(config->global,
|
||||||
|
"Using embedded CA bundle, for proxies (%zu bytes)",
|
||||||
|
blob.len);
|
||||||
|
result = curl_easy_setopt(curl, CURLOPT_PROXY_CAINFO_BLOB, &blob);
|
||||||
|
if(result == CURLE_NOT_BUILT_IN) {
|
||||||
|
warnf(global,
|
||||||
|
"ignoring embedded CA bundle, not supported by libcurl");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(config->crlfile)
|
if(config->crlfile)
|
||||||
my_setopt_str(curl, CURLOPT_CRLFILE, config->crlfile);
|
my_setopt_str(curl, CURLOPT_CRLFILE, config->crlfile);
|
||||||
if(config->proxy_crlfile)
|
if(config->proxy_crlfile)
|
||||||
@ -2842,6 +2877,12 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
|
|||||||
/* Check if we were asked to list the SSL engines */
|
/* Check if we were asked to list the SSL engines */
|
||||||
else if(res == PARAM_ENGINES_REQUESTED)
|
else if(res == PARAM_ENGINES_REQUESTED)
|
||||||
tool_list_engines();
|
tool_list_engines();
|
||||||
|
/* Check if we were asked to dump the embedded CA bundle */
|
||||||
|
else if(res == PARAM_CA_EMBED_REQUESTED) {
|
||||||
|
#ifdef CURL_CA_EMBED
|
||||||
|
printf("%s", curl_ca_embed);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
else if(res == PARAM_LIBCURL_UNSUPPORTED_PROTOCOL)
|
else if(res == PARAM_LIBCURL_UNSUPPORTED_PROTOCOL)
|
||||||
result = CURLE_UNSUPPORTED_PROTOCOL;
|
result = CURLE_UNSUPPORTED_PROTOCOL;
|
||||||
else if(res == PARAM_READ_ERROR)
|
else if(res == PARAM_READ_ERROR)
|
||||||
|
|||||||
@ -262,7 +262,8 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
|
|||||||
if(res != PARAM_HELP_REQUESTED &&
|
if(res != PARAM_HELP_REQUESTED &&
|
||||||
res != PARAM_MANUAL_REQUESTED &&
|
res != PARAM_MANUAL_REQUESTED &&
|
||||||
res != PARAM_VERSION_INFO_REQUESTED &&
|
res != PARAM_VERSION_INFO_REQUESTED &&
|
||||||
res != PARAM_ENGINES_REQUESTED) {
|
res != PARAM_ENGINES_REQUESTED &&
|
||||||
|
res != PARAM_CA_EMBED_REQUESTED) {
|
||||||
const char *reason = param2text(res);
|
const char *reason = param2text(res);
|
||||||
errorf(operation->global, "%s:%d: '%s' %s",
|
errorf(operation->global, "%s:%d: '%s' %s",
|
||||||
filename, lineno, option, reason);
|
filename, lineno, option, reason);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user