|
From b2b0eab46a8ae36f2dd49159e65c90c1089a0f96 Mon Sep 17 00:00:00 2001
|
|
From: "Thierry FOURNIER / OZON.IO" <thierry.fournier@ozon.io>
|
|
Date: Thu, 6 Oct 2016 10:56:48 +0200
|
|
Subject: [PATCH 11/26] BUG/MINOR: ssl: prevent multiple entries for the same
|
|
certificate
|
|
|
|
Today, the certificate are indexed int he SNI tree using their CN and the
|
|
list of thier AltNames. So, Some certificates have the same names in the
|
|
CN and one of the AltNames entries.
|
|
|
|
Typically Let's Encrypt duplicate the the DNS name in the CN and the
|
|
AltName.
|
|
|
|
This patch prevents the creation of identical entries in the trees. It
|
|
checks the same DNS name and the same SSL context.
|
|
|
|
If the same certificate is registered two time it will be duplicated.
|
|
|
|
This patch should be backported in the 1.6 and 1.5 version.
|
|
(cherry picked from commit 07c3d78c2c0693ee37db71c34723597638b6ab3f)
|
|
---
|
|
src/ssl_sock.c | 22 +++++++++++++++++++---
|
|
1 file changed, 19 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
|
|
index 5f9a203..ad8054d 100644
|
|
--- a/src/ssl_sock.c
|
|
+++ b/src/ssl_sock.c
|
|
@@ -1556,6 +1556,7 @@ static int ssl_sock_add_cert_sni(SSL_CTX *ctx, struct bind_conf *s, char *name,
|
|
{
|
|
struct sni_ctx *sc;
|
|
int wild = 0, neg = 0;
|
|
+ struct ebmb_node *node;
|
|
|
|
if (*name == '!') {
|
|
neg = 1;
|
|
@@ -1571,12 +1572,27 @@ static int ssl_sock_add_cert_sni(SSL_CTX *ctx, struct bind_conf *s, char *name,
|
|
if (*name) {
|
|
int j, len;
|
|
len = strlen(name);
|
|
+ for (j = 0; j < len && j < trash.size; j++)
|
|
+ trash.str[j] = tolower(name[j]);
|
|
+ if (j >= trash.size)
|
|
+ return order;
|
|
+ trash.str[j] = 0;
|
|
+
|
|
+ /* Check for duplicates. */
|
|
+ if (wild)
|
|
+ node = ebst_lookup(&s->sni_w_ctx, trash.str);
|
|
+ else
|
|
+ node = ebst_lookup(&s->sni_ctx, trash.str);
|
|
+ for (; node; node = ebmb_next_dup(node)) {
|
|
+ sc = ebmb_entry(node, struct sni_ctx, name);
|
|
+ if (sc->ctx == ctx && sc->neg == neg)
|
|
+ return order;
|
|
+ }
|
|
+
|
|
sc = malloc(sizeof(struct sni_ctx) + len + 1);
|
|
if (!sc)
|
|
return order;
|
|
- for (j = 0; j < len; j++)
|
|
- sc->name.key[j] = tolower(name[j]);
|
|
- sc->name.key[len] = 0;
|
|
+ memcpy(sc->name.key, trash.str, len + 1);
|
|
sc->ctx = ctx;
|
|
sc->order = order++;
|
|
sc->neg = neg;
|
|
--
|
|
2.7.3
|
|
|