Skip to content

Commit

Permalink
server_certificate_verifier extended to reuse built-in verifier (#2064)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
urosg80 and UrosG authored Feb 17, 2025
1 parent 574f5ce commit cdc2230
Showing 1 changed file with 27 additions and 10 deletions.
37 changes: 27 additions & 10 deletions httplib.h
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,15 @@ struct scope_exit {

} // 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 {
// Information responses
Continue_100 = 100,
Expand Down Expand Up @@ -1483,7 +1492,8 @@ class ClientImpl {
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
void enable_server_certificate_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

void set_logger(Logger logger);
Expand Down Expand Up @@ -1600,7 +1610,7 @@ class ClientImpl {
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
bool server_certificate_verification_ = true;
bool server_hostname_verification_ = true;
std::function<bool(SSL *ssl)> server_certificate_verifier_;
std::function<SSLVerifierResponse(SSL *ssl)> server_certificate_verifier_;
#endif

Logger logger_;
Expand Down Expand Up @@ -1913,7 +1923,8 @@ class Client {
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
void enable_server_certificate_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

void set_logger(Logger logger);
Expand Down Expand Up @@ -9008,7 +9019,7 @@ inline void ClientImpl::enable_server_hostname_verification(bool enabled) {
}

inline void ClientImpl::set_server_certificate_verifier(
std::function<bool(SSL *ssl)> verifier) {
std::function<SSLVerifierResponse(SSL *ssl)> verifier) {
server_certificate_verifier_ = verifier;
}
#endif
Expand Down Expand Up @@ -9617,12 +9628,18 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) {
}

if (server_certificate_verification_) {
auto verification_status = SSLVerifierResponse::NoDecisionMade;

if (server_certificate_verifier_) {
if (!server_certificate_verifier_(ssl2)) {
error = Error::SSLServerVerification;
return false;
}
} else {
verification_status = server_certificate_verifier_(ssl2);
}

if (verification_status == SSLVerifierResponse::CertificateRejected) {
error = Error::SSLServerVerification;
return false;
}

if (verification_status == SSLVerifierResponse::NoDecisionMade) {
verify_result_ = SSL_get_verify_result(ssl2);

if (verify_result_ != X509_V_OK) {
Expand Down Expand Up @@ -10383,7 +10400,7 @@ inline void Client::enable_server_hostname_verification(bool enabled) {
}

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);
}
#endif
Expand Down

0 comments on commit cdc2230

Please sign in to comment.