Hi,

The attached patch adds a new keyword to servers, "check-sni", that lets you
specify which SNI to use when doing health checks over SSL.

Regards,

Olivier
>From 24779f0985041f4e680855d453a4bc5d096756f9 Mon Sep 17 00:00:00 2001
From: Olivier Houchard <ohouch...@haproxy.com>
Date: Tue, 17 Oct 2017 17:33:43 +0200
Subject: [PATCH] MINOR: checks: Add a new keyword to specify a SNI when doing
 SSL checks.

Add a new keyword, "check-sni", to be able to specify the SNI to be used when
doing health checks over SSL.
---
 doc/configuration.txt  |  4 ++++
 include/types/checks.h |  1 +
 src/checks.c           |  8 ++++++++
 src/ssl_sock.c         | 19 +++++++++++++++++++
 4 files changed, 32 insertions(+)

diff --git a/doc/configuration.txt b/doc/configuration.txt
index 934f87759..1421808b8 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -10970,6 +10970,10 @@ check-send-proxy
   "check-send-proxy" option needs to be used to force the use of the
   protocol. See also the "send-proxy" option for more information.
 
+check-sni
+  This option allows you to specify the SNI to be used when doing health checks
+  over SSL.
+
 check-ssl
   This option forces encryption of all health checks over SSL, regardless of
   whether the server uses SSL or not for the normal traffic. This is generally
diff --git a/include/types/checks.h b/include/types/checks.h
index 283ff3dbe..3559f2d52 100644
--- a/include/types/checks.h
+++ b/include/types/checks.h
@@ -184,6 +184,7 @@ struct check {
        char **envp;                            /* the environment to use if 
running a process-based check */
        struct pid_list *curpid;                /* entry in pid_list used for 
current process-based test, or -1 if not in test */
        struct sockaddr_storage addr;           /* the address to check */
+       char *sni;                              /* Server name */
 };
 
 struct check_status {
diff --git a/src/checks.c b/src/checks.c
index c02935cf0..413365b24 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -60,6 +60,10 @@
 #include <proto/dns.h>
 #include <proto/proto_udp.h>
 
+#ifdef USE_OPENSSL
+#include <proto/ssl_sock.h>
+#endif /* USE_OPENSSL */
+
 static int httpchk_expect(struct server *s, int done);
 static int tcpcheck_get_step_id(struct check *);
 static char * tcpcheck_get_step_comment(struct check *, int);
@@ -1597,6 +1601,10 @@ static int connect_conn_chk(struct task *t)
        ret = SF_ERR_INTERNAL;
        if (proto && proto->connect)
                ret = proto->connect(conn, check->type, quickack ? 2 : 0);
+#ifdef USE_OPENSSL
+       if (s->check.sni)
+               ssl_sock_set_servername(conn, s->check.sni);
+#endif
        if (s->check.send_proxy && !(check->state & CHK_ST_AGENT)) {
                conn->send_proxy_ofs = 1;
                conn->flags |= CO_FL_SEND_PROXY;
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index 774a5a683..1d00b42e4 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -7075,6 +7075,24 @@ static int srv_parse_ca_file(char **args, int *cur_arg, 
struct proxy *px, struct
        return 0;
 }
 
+/* parse the "check-sni" server keyword */
+static int srv_parse_check_sni(char **args, int *cur_arg, struct proxy *px, 
struct server *newsrv, char **err)
+{
+       if (!*args[*cur_arg + 1]) {
+               if (err)
+                       memprintf(err, "'%s' : missing SNI", args[*cur_arg]);
+               return ERR_ALERT | ERR_FATAL;
+       }
+
+       newsrv->check.sni = strdup(args[*cur_arg + 1]);
+       if (!newsrv->check.sni) {
+               memprintf(err, "'%s' : failed to allocate memory", 
args[*cur_arg]);
+               return ERR_ALERT | ERR_FATAL;
+       }
+       return 0;
+
+}
+
 /* parse the "check-ssl" server keyword */
 static int srv_parse_check_ssl(char **args, int *cur_arg, struct proxy *px, 
struct server *newsrv, char **err)
 {
@@ -8031,6 +8049,7 @@ static struct bind_kw_list bind_kws = { "SSL", { }, {
  */
 static struct srv_kw_list srv_kws = { "SSL", { }, {
        { "ca-file",                 srv_parse_ca_file,            1, 1 }, /* 
set CAfile to process verify server cert */
+       { "check-sni",               srv_parse_check_sni,          1, 1 }, /* 
set SNI */
        { "check-ssl",               srv_parse_check_ssl,          0, 1 }, /* 
enable SSL for health checks */
        { "ciphers",                 srv_parse_ciphers,            1, 1 }, /* 
select the cipher suite */
        { "crl-file",                srv_parse_crl_file,           1, 1 }, /* 
set certificate revocation list file use on server cert verify */
-- 
2.13.5

Reply via email to