|
@@ -357,14 +357,32 @@ using socket_t = int;
|
|
|
#include <any>
|
|
#include <any>
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
+// On macOS with a TLS backend, enable Keychain root certificates by default
|
|
|
|
|
+// unless the user explicitly opts out.
|
|
|
|
|
+#if defined(__APPLE__) && \
|
|
|
|
|
+ !defined(CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES) && \
|
|
|
|
|
+ (defined(CPPHTTPLIB_OPENSSL_SUPPORT) || \
|
|
|
|
|
+ defined(CPPHTTPLIB_MBEDTLS_SUPPORT) || \
|
|
|
|
|
+ defined(CPPHTTPLIB_WOLFSSL_SUPPORT))
|
|
|
|
|
+#ifndef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
|
|
+#define CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
|
|
+#endif
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+// On Windows, enable Schannel certificate verification by default
|
|
|
|
|
+// unless the user explicitly opts out.
|
|
|
|
|
+#if defined(_WIN32) && \
|
|
|
|
|
+ !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
+#define CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \
|
|
#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \
|
|
|
defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
|
|
defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
|
|
|
#if TARGET_OS_MAC
|
|
#if TARGET_OS_MAC
|
|
|
#include <CFNetwork/CFHost.h>
|
|
#include <CFNetwork/CFHost.h>
|
|
|
#include <CoreFoundation/CoreFoundation.h>
|
|
#include <CoreFoundation/CoreFoundation.h>
|
|
|
#endif
|
|
#endif
|
|
|
-#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO or
|
|
|
|
|
- // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
|
|
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
|
|
|
#ifdef _WIN32
|
|
#ifdef _WIN32
|
|
@@ -382,11 +400,11 @@ using socket_t = int;
|
|
|
#endif
|
|
#endif
|
|
|
#endif // _WIN32
|
|
#endif // _WIN32
|
|
|
|
|
|
|
|
-#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
#if TARGET_OS_MAC
|
|
#if TARGET_OS_MAC
|
|
|
#include <Security/Security.h>
|
|
#include <Security/Security.h>
|
|
|
#endif
|
|
#endif
|
|
|
-#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO
|
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
#include <openssl/err.h>
|
|
#include <openssl/err.h>
|
|
|
#include <openssl/evp.h>
|
|
#include <openssl/evp.h>
|
|
@@ -430,11 +448,11 @@ using socket_t = int;
|
|
|
#pragma comment(lib, "crypt32.lib")
|
|
#pragma comment(lib, "crypt32.lib")
|
|
|
#endif
|
|
#endif
|
|
|
#endif // _WIN32
|
|
#endif // _WIN32
|
|
|
-#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
#if TARGET_OS_MAC
|
|
#if TARGET_OS_MAC
|
|
|
#include <Security/Security.h>
|
|
#include <Security/Security.h>
|
|
|
#endif
|
|
#endif
|
|
|
-#endif // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
// Mbed TLS 3.x API compatibility
|
|
// Mbed TLS 3.x API compatibility
|
|
|
#if MBEDTLS_VERSION_MAJOR >= 3
|
|
#if MBEDTLS_VERSION_MAJOR >= 3
|
|
@@ -473,11 +491,11 @@ using socket_t = int;
|
|
|
#pragma comment(lib, "crypt32.lib")
|
|
#pragma comment(lib, "crypt32.lib")
|
|
|
#endif
|
|
#endif
|
|
|
#endif // _WIN32
|
|
#endif // _WIN32
|
|
|
-#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
#if TARGET_OS_MAC
|
|
#if TARGET_OS_MAC
|
|
|
#include <Security/Security.h>
|
|
#include <Security/Security.h>
|
|
|
#endif
|
|
#endif
|
|
|
-#endif // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
|
|
|
|
+#endif
|
|
|
#endif // CPPHTTPLIB_WOLFSSL_SUPPORT
|
|
#endif // CPPHTTPLIB_WOLFSSL_SUPPORT
|
|
|
|
|
|
|
|
// Define CPPHTTPLIB_SSL_ENABLED if any SSL backend is available
|
|
// Define CPPHTTPLIB_SSL_ENABLED if any SSL backend is available
|
|
@@ -2561,8 +2579,7 @@ public:
|
|
|
|
|
|
|
|
tls::ctx_t tls_context() const;
|
|
tls::ctx_t tls_context() const;
|
|
|
|
|
|
|
|
-#if defined(_WIN32) && \
|
|
|
|
|
- !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
void enable_windows_certificate_verification(bool enabled);
|
|
void enable_windows_certificate_verification(bool enabled);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -2683,8 +2700,7 @@ public:
|
|
|
|
|
|
|
|
tls::ctx_t tls_context() const { return ctx_; }
|
|
tls::ctx_t tls_context() const { return ctx_; }
|
|
|
|
|
|
|
|
-#if defined(_WIN32) && \
|
|
|
|
|
- !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
void enable_windows_certificate_verification(bool enabled);
|
|
void enable_windows_certificate_verification(bool enabled);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -2716,8 +2732,7 @@ private:
|
|
|
|
|
|
|
|
std::function<SSLVerifierResponse(tls::session_t)> session_verifier_;
|
|
std::function<SSLVerifierResponse(tls::session_t)> session_verifier_;
|
|
|
|
|
|
|
|
-#if defined(_WIN32) && \
|
|
|
|
|
- !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
bool enable_windows_cert_verification_ = true;
|
|
bool enable_windows_cert_verification_ = true;
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -15423,8 +15438,7 @@ inline void SSLClient::set_session_verifier(
|
|
|
session_verifier_ = std::move(verifier);
|
|
session_verifier_ = std::move(verifier);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#if defined(_WIN32) && \
|
|
|
|
|
- !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
inline void SSLClient::enable_windows_certificate_verification(bool enabled) {
|
|
inline void SSLClient::enable_windows_certificate_verification(bool enabled) {
|
|
|
enable_windows_cert_verification_ = enabled;
|
|
enable_windows_cert_verification_ = enabled;
|
|
|
}
|
|
}
|
|
@@ -15582,8 +15596,7 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#if defined(_WIN32) && \
|
|
|
|
|
- !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
// Additional Windows Schannel verification.
|
|
// Additional Windows Schannel verification.
|
|
|
// This provides real-time certificate validation with Windows Update
|
|
// This provides real-time certificate validation with Windows Update
|
|
|
// integration, working with both OpenSSL and MbedTLS backends.
|
|
// integration, working with both OpenSSL and MbedTLS backends.
|
|
@@ -15629,8 +15642,7 @@ inline void Client::enable_server_hostname_verification(bool enabled) {
|
|
|
cli_->enable_server_hostname_verification(enabled);
|
|
cli_->enable_server_hostname_verification(enabled);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#if defined(_WIN32) && \
|
|
|
|
|
- !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE
|
|
|
inline void Client::enable_windows_certificate_verification(bool enabled) {
|
|
inline void Client::enable_windows_certificate_verification(bool enabled) {
|
|
|
if (is_ssl_) {
|
|
if (is_ssl_) {
|
|
|
static_cast<SSLClient &>(*cli_).enable_windows_certificate_verification(
|
|
static_cast<SSLClient &>(*cli_).enable_windows_certificate_verification(
|
|
@@ -15753,7 +15765,7 @@ inline bool enumerate_windows_system_certs(Callback cb) {
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
-#if defined(__APPLE__) && defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
|
|
|
|
|
|
|
+#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
|
|
|
// Enumerate macOS Keychain certificates and call callback with DER data
|
|
// Enumerate macOS Keychain certificates and call callback with DER data
|
|
|
template <typename Callback>
|
|
template <typename Callback>
|
|
|
inline bool enumerate_macos_keychain_certs(Callback cb) {
|
|
inline bool enumerate_macos_keychain_certs(Callback cb) {
|