|
|
@@ -435,6 +435,15 @@ private:
|
|
|
|
|
|
} // 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,
|
|
|
@@ -1483,7 +1492,8 @@ public:
|
|
|
#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);
|
|
|
@@ -1600,7 +1610,7 @@ protected:
|
|
|
#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_;
|
|
|
@@ -1913,7 +1923,8 @@ public:
|
|
|
#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);
|
|
|
@@ -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
|
|
|
@@ -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) {
|
|
|
@@ -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
|