Adding d/p/16_check_curl_openssl_error from upstream
https://patch-diff.githubusercontent.com/raw/monitoring-plugins/monitoring-plugins/pull/2022.patch
This commit is contained in:
parent
1b018b3ee1
commit
9c49b6f179
2 changed files with 116 additions and 0 deletions
115
debian/patches/16_check_curl_openssl_error
vendored
Normal file
115
debian/patches/16_check_curl_openssl_error
vendored
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
From 528e92c180148703ee2cb90d7291f4edbfc270d4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sven Nierlein <sven@consol.de>
|
||||||
|
Date: Wed, 9 Oct 2024 09:50:39 +0200
|
||||||
|
Subject: [PATCH] fix check_curl: OpenSSL SSL_read: error:0A000126:SSL
|
||||||
|
routines::unexpected eof while reading, errno 0
|
||||||
|
|
||||||
|
using check_curl on a probably embedded device responding as 'Server: GoAhead-Webs'
|
||||||
|
|
||||||
|
%> check_curl -H ... -S -vvv
|
||||||
|
|
||||||
|
> GET / HTTP/1.1
|
||||||
|
Host: ...
|
||||||
|
User-Agent: check_curl/v2.4.0 (monitoring-plugins 2.4.0, libcurl/7.76.1 OpenSSL/3.0.7 zlib/1.2.11 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.1 (+libidn2/2.3.0) libssh/0.10.4/openssl/zlib nghttp2/1.43.0)
|
||||||
|
Accept: */*
|
||||||
|
Connection: close
|
||||||
|
|
||||||
|
* Mark bundle as not supporting multiuse
|
||||||
|
* HTTP 1.0, assume close after body
|
||||||
|
< HTTP/1.0 302 Redirect
|
||||||
|
< Server: GoAhead-Webs
|
||||||
|
< Date: Tue Mar 26 17:57:16 2019
|
||||||
|
< Cache-Control: no-cache, no-store, must-revalidate,private
|
||||||
|
< Pragma: no-cache
|
||||||
|
< Expires: 0
|
||||||
|
< Content-Type: text/html
|
||||||
|
< X-Frame-Options: sameorigin
|
||||||
|
< X-XSS-Protection: 1; mode=block
|
||||||
|
< X-Content-Type-Options: nosniff
|
||||||
|
< Location: https://...
|
||||||
|
<
|
||||||
|
* OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0
|
||||||
|
* Closing connection 0
|
||||||
|
|
||||||
|
reading the discussion on https://github.com/openssl/openssl/discussions/22690 suggest to set the option SSL_OP_IGNORE_UNEXPECTED_EOF
|
||||||
|
which makes check_curl behave like check_http at this point.
|
||||||
|
Since this is a rather new flag, fencing it in ifdefs.
|
||||||
|
And since there can only be one ssl ctx function, we need to move both tasks into one function.
|
||||||
|
---
|
||||||
|
plugins/check_curl.c | 29 ++++++++++++++++++++++-------
|
||||||
|
1 file changed, 22 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||||
|
index 7f45b5a79..d3bddacd2 100644
|
||||||
|
--- a/plugins/check_curl.c
|
||||||
|
+++ b/plugins/check_curl.c
|
||||||
|
@@ -214,6 +214,7 @@ char *client_privkey = NULL;
|
||||||
|
char *ca_cert = NULL;
|
||||||
|
bool verify_peer_and_host = false;
|
||||||
|
bool is_openssl_callback = false;
|
||||||
|
+bool add_sslctx_verify_fun = false;
|
||||||
|
#if defined(HAVE_SSL) && defined(USE_OPENSSL)
|
||||||
|
X509 *cert = NULL;
|
||||||
|
#endif /* defined(HAVE_SSL) && defined(USE_OPENSSL) */
|
||||||
|
@@ -299,7 +300,7 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
|
int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
|
||||||
|
{
|
||||||
|
- (void) preverify_ok;
|
||||||
|
+ (void) preverify_ok;
|
||||||
|
/* TODO: we get all certificates of the chain, so which ones
|
||||||
|
* should we test?
|
||||||
|
* TODO: is the last certificate always the server certificate?
|
||||||
|
@@ -324,9 +325,18 @@ int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
|
||||||
|
|
||||||
|
CURLcode sslctxfun(CURL *curl, SSL_CTX *sslctx, void *parm)
|
||||||
|
{
|
||||||
|
- (void) curl; // ignore unused parameter
|
||||||
|
- (void) parm; // ignore unused parameter
|
||||||
|
- SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER, verify_callback);
|
||||||
|
+ (void) curl; // ignore unused parameter
|
||||||
|
+ (void) parm; // ignore unused parameter
|
||||||
|
+ if(add_sslctx_verify_fun) {
|
||||||
|
+ SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER, verify_callback);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // workaround for issue:
|
||||||
|
+ // OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0
|
||||||
|
+ // see discussion https://github.com/openssl/openssl/discussions/22690
|
||||||
|
+#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF
|
||||||
|
+ SSL_CTX_set_options(sslctx, SSL_OP_IGNORE_UNEXPECTED_EOF);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
@@ -678,9 +688,8 @@ check_http (void)
|
||||||
|
* OpenSSL-style libraries only!) */
|
||||||
|
#ifdef USE_OPENSSL
|
||||||
|
/* libcurl and monitoring plugins built with OpenSSL, good */
|
||||||
|
- handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION");
|
||||||
|
+ add_sslctx_verify_fun = true;
|
||||||
|
is_openssl_callback = true;
|
||||||
|
-#else /* USE_OPENSSL */
|
||||||
|
#endif /* USE_OPENSSL */
|
||||||
|
/* libcurl is built with OpenSSL, monitoring plugins, so falling
|
||||||
|
* back to manually extracting certificate information */
|
||||||
|
@@ -713,12 +722,18 @@ check_http (void)
|
||||||
|
#else /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 1) */
|
||||||
|
/* old libcurl, our only hope is OpenSSL, otherwise we are out of luck */
|
||||||
|
if (ssl_library == CURLHELP_SSL_LIBRARY_OPENSSL || ssl_library == CURLHELP_SSL_LIBRARY_LIBRESSL)
|
||||||
|
- handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION");
|
||||||
|
+ add_sslctx_verify_fun = true;
|
||||||
|
else
|
||||||
|
die (STATE_CRITICAL, "HTTP CRITICAL - Cannot retrieve certificates (no CURLOPT_SSL_CTX_FUNCTION, no OpenSSL library or libcurl too old and has no CURLOPT_CERTINFO)\n");
|
||||||
|
#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 1) */
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 10, 6) /* required for CURLOPT_SSL_CTX_FUNCTION */
|
||||||
|
+ // ssl ctx function is not available with all ssl backends
|
||||||
|
+ if (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, NULL) != CURLE_UNKNOWN_OPTION)
|
||||||
|
+ handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION");
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#endif /* LIBCURL_FEATURE_SSL */
|
||||||
|
|
||||||
|
/* set default or user-given user agent identification */
|
1
debian/patches/series
vendored
1
debian/patches/series
vendored
|
@ -7,4 +7,5 @@
|
||||||
13_check_mysql_fix_variables
|
13_check_mysql_fix_variables
|
||||||
14_check_curl_remove_experimental_state
|
14_check_curl_remove_experimental_state
|
||||||
15_check_curl_fix_regex
|
15_check_curl_fix_regex
|
||||||
|
16_check_curl_openssl_error
|
||||||
# feature patches
|
# feature patches
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue