1
0
mirror of synced 2025-04-19 00:24:02 +03:00

server_certificate_verifier extended to reuse built-in verifier (#2064)

* server_certificate_verifier extended to reuse built-in verifier

* code cleanup and SSLVerifierResponse enum clarification as per @falbrechtskirchinger comment

* cleanup

* clang-format

* change local var verification_status_ declaration to auto

* change local var verification_status_ to verification_status

* clang-format

* clang-format

---------

Co-authored-by: UrosG <uros@ub330.net>
This commit is contained in:
Uros Gaber 2025-02-17 23:24:41 +01:00 committed by GitHub
parent 574f5ce93e
commit cdc223019a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -435,6 +435,15 @@ private:
} // namespace detail } // namespace detail
enum SSLVerifierResponse {
// no decision has been made, use the built-in certificate verifier
NoDecisionMade,
// connection certificate is verified and accepted
CertificateAccepted,
// connection certificate was processed but is rejected
CertificateRejected
};
enum StatusCode { enum StatusCode {
// Information responses // Information responses
Continue_100 = 100, Continue_100 = 100,
@ -1483,7 +1492,8 @@ public:
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
void enable_server_certificate_verification(bool enabled); void enable_server_certificate_verification(bool enabled);
void enable_server_hostname_verification(bool enabled); void enable_server_hostname_verification(bool enabled);
void set_server_certificate_verifier(std::function<bool(SSL *ssl)> verifier); void set_server_certificate_verifier(
std::function<SSLVerifierResponse(SSL *ssl)> verifier);
#endif #endif
void set_logger(Logger logger); void set_logger(Logger logger);
@ -1600,7 +1610,7 @@ protected:
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
bool server_certificate_verification_ = true; bool server_certificate_verification_ = true;
bool server_hostname_verification_ = true; bool server_hostname_verification_ = true;
std::function<bool(SSL *ssl)> server_certificate_verifier_; std::function<SSLVerifierResponse(SSL *ssl)> server_certificate_verifier_;
#endif #endif
Logger logger_; Logger logger_;
@ -1913,7 +1923,8 @@ public:
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
void enable_server_certificate_verification(bool enabled); void enable_server_certificate_verification(bool enabled);
void enable_server_hostname_verification(bool enabled); void enable_server_hostname_verification(bool enabled);
void set_server_certificate_verifier(std::function<bool(SSL *ssl)> verifier); void set_server_certificate_verifier(
std::function<SSLVerifierResponse(SSL *ssl)> verifier);
#endif #endif
void set_logger(Logger logger); void set_logger(Logger logger);
@ -9008,7 +9019,7 @@ inline void ClientImpl::enable_server_hostname_verification(bool enabled) {
} }
inline void ClientImpl::set_server_certificate_verifier( inline void ClientImpl::set_server_certificate_verifier(
std::function<bool(SSL *ssl)> verifier) { std::function<SSLVerifierResponse(SSL *ssl)> verifier) {
server_certificate_verifier_ = verifier; server_certificate_verifier_ = verifier;
} }
#endif #endif
@ -9617,12 +9628,18 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) {
} }
if (server_certificate_verification_) { if (server_certificate_verification_) {
auto verification_status = SSLVerifierResponse::NoDecisionMade;
if (server_certificate_verifier_) { if (server_certificate_verifier_) {
if (!server_certificate_verifier_(ssl2)) { verification_status = server_certificate_verifier_(ssl2);
}
if (verification_status == SSLVerifierResponse::CertificateRejected) {
error = Error::SSLServerVerification; error = Error::SSLServerVerification;
return false; return false;
} }
} else {
if (verification_status == SSLVerifierResponse::NoDecisionMade) {
verify_result_ = SSL_get_verify_result(ssl2); verify_result_ = SSL_get_verify_result(ssl2);
if (verify_result_ != X509_V_OK) { if (verify_result_ != X509_V_OK) {
@ -10383,7 +10400,7 @@ inline void Client::enable_server_hostname_verification(bool enabled) {
} }
inline void Client::set_server_certificate_verifier( inline void Client::set_server_certificate_verifier(
std::function<bool(SSL *ssl)> verifier) { std::function<SSLVerifierResponse(SSL *ssl)> verifier) {
cli_->set_server_certificate_verifier(verifier); cli_->set_server_certificate_verifier(verifier);
} }
#endif #endif