Skip to content

Commit 5cc107c

Browse files
authored
Merge pull request #1 from mmguero-dev/master
PR: kvspb#237 from mmguero-dev
2 parents 83c059b + 61b70e4 commit 5cc107c

File tree

1 file changed

+53
-29
lines changed

1 file changed

+53
-29
lines changed

ngx_http_auth_ldap_module.c

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* SUCH DAMAGE.
2727
*/
2828

29+
#include <sys/socket.h>
2930
#include <ngx_config.h>
3031
#include <ngx_core.h>
3132
#include <ngx_http.h>
@@ -69,6 +70,10 @@ extern int ldap_init_fd(ber_socket_t fd, int proto, const char *url, LDAP **ld);
6970

7071
#define NGX_HTTP_AUTH_LDAP_MAX_SERVERS_SIZE 7
7172

73+
#define SSL_CERT_VERIFY_OFF 0
74+
#define SSL_CERT_VERIFY_FULL 1
75+
#define SSL_CERT_VERIFY_CHAIN 2
76+
7277

7378
typedef struct {
7479
LDAPURLDesc *ludpp;
@@ -431,18 +436,24 @@ ngx_http_auth_ldap_ldap_server(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
431436
return NGX_CONF_ERROR;
432437
}
433438
server->connections = i;
434-
} else if (ngx_strcmp(value[0].data, "ssl_check_cert") == 0 && ngx_strcmp(value[1].data, "on") == 0) {
435-
#if OPENSSL_VERSION_NUMBER >= 0x10002000
436-
server->ssl_check_cert = 1;
437-
#else
438-
#if GNUC > 4
439-
#warning "http_auth_ldap: Compiling with OpenSSL < 1.0.2, certificate verification will be unavailable. OPENSSL_VERSION_NUMBER == " XSTR(OPENSSL_VERSION_NUMBER)
440-
#endif
441-
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
442-
"http_auth_ldap: 'ssl_cert_check': cannot verify remote certificate's domain name because "
443-
"your version of OpenSSL is too old. "
444-
"Please install OpenSSL >= 1.02 and recompile nginx.");
445-
#endif
439+
} else if (ngx_strcmp(value[0].data, "ssl_check_cert") == 0) {
440+
#if OPENSSL_VERSION_NUMBER >= 0x10002000
441+
if ((ngx_strcmp(value[1].data, "on") == 0) || (ngx_strcmp(value[1].data, "full") == 0)) {
442+
server->ssl_check_cert = SSL_CERT_VERIFY_FULL;
443+
} else if (ngx_strcmp(value[1].data, "chain") == 0) {
444+
server->ssl_check_cert = SSL_CERT_VERIFY_CHAIN;
445+
} else {
446+
server->ssl_check_cert = SSL_CERT_VERIFY_OFF;
447+
}
448+
#else
449+
#if GNUC > 4
450+
#warning "http_auth_ldap: Compiling with OpenSSL < 1.0.2, certificate verification will be unavailable. OPENSSL_VERSION_NUMBER == " XSTR(OPENSSL_VERSION_NUMBER)
451+
#endif
452+
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
453+
"http_auth_ldap: 'ssl_cert_check': cannot verify remote certificate's domain name because "
454+
"your version of OpenSSL is too old. "
455+
"Please install OpenSSL >= 1.0.2 and recompile nginx.");
456+
#endif
446457
} else if (ngx_strcmp(value[0].data, "ssl_ca_dir") == 0) {
447458
server->ssl_ca_dir = value[1];
448459
} else if (ngx_strcmp(value[0].data, "ssl_ca_file") == 0) {
@@ -1334,18 +1345,31 @@ ngx_http_auth_ldap_ssl_handshake_handler(ngx_connection_t *conn, ngx_flag_t vali
13341345
long chain_verified = SSL_get_verify_result(conn->ssl->connection);
13351346

13361347
int addr_verified;
1337-
char *hostname = c->server->ludpp->lud_host;
1338-
addr_verified = X509_check_host(cert, hostname, 0, 0, 0);
1339-
1340-
if (!addr_verified) { // domain not in cert? try IP
1341-
size_t len; // get IP length
1342-
if (conn->sockaddr->sa_family == 4) len = 4;
1343-
else if (conn->sockaddr->sa_family == 6) len = 16;
1344-
else { // very unlikely indeed
1345-
ngx_http_auth_ldap_close_connection(c);
1346-
return;
1348+
if (c->server->ssl_check_cert == SSL_CERT_VERIFY_CHAIN) {
1349+
// chain_verified is enough, not requiring full name/IP verification
1350+
addr_verified = 1;
1351+
1352+
} else {
1353+
// verify hostname/IP
1354+
char *hostname = c->server->ludpp->lud_host;
1355+
addr_verified = X509_check_host(cert, hostname, 0, 0, 0);
1356+
1357+
if (!addr_verified) { // domain not in cert? try IP
1358+
size_t len; // get IP length
1359+
1360+
struct sockaddr *conn_sockaddr = NULL;
1361+
if (conn->sockaddr != NULL) conn_sockaddr = conn->sockaddr;
1362+
else if (c->conn.sockaddr != NULL) conn_sockaddr = c->conn.sockaddr;
1363+
else conn_sockaddr = &c->server->parsed_url.sockaddr.sockaddr;
1364+
1365+
if (conn_sockaddr->sa_family == AF_INET) len = 4;
1366+
else if (conn_sockaddr->sa_family == AF_INET6) len = 16;
1367+
else { // very unlikely indeed
1368+
ngx_http_auth_ldap_close_connection(c);
1369+
return;
1370+
}
1371+
addr_verified = X509_check_ip(cert, (const unsigned char*)conn_sockaddr->sa_data, len, 0);
13471372
}
1348-
addr_verified = X509_check_ip(cert, (const unsigned char*)conn->sockaddr->sa_data, len, 0);
13491373
}
13501374

13511375
// Find anything fishy?
@@ -1528,11 +1552,11 @@ ngx_http_auth_ldap_read_handler(ngx_event_t *rev)
15281552

15291553
// if LDAP_SERVER_DOWN (usually timeouts or server disconnects)
15301554
if (rc == LDAP_SERVER_DOWN && \
1531-
c->server->max_down_retries_count < c->server->max_down_retries) {
1532-
/**
1533-
update counter (this is always reset in
1534-
ngx_http_auth_ldap_connect() for a successful ldap
1535-
connection
1555+
c->server->max_down_retries_count < c->server->max_down_retries) {
1556+
/**
1557+
update counter (this is always reset in
1558+
ngx_http_auth_ldap_connect() for a successful ldap
1559+
connection
15361560
**/
15371561
c->server->max_down_retries_count++;
15381562
ngx_log_error(NGX_LOG_ERR, c->log, 0, "http_auth_ldap: LDAP_SERVER_DOWN: retry count: %d",
@@ -1542,7 +1566,7 @@ ngx_http_auth_ldap_read_handler(ngx_event_t *rev)
15421566
// timer call to this read handler again
15431567
ngx_http_auth_ldap_reconnect_handler(rev);
15441568
return;
1545-
}
1569+
}
15461570

15471571
return;
15481572
}

0 commit comments

Comments
 (0)