26
26
* SUCH DAMAGE.
27
27
*/
28
28
29
+ #include <sys/socket.h>
29
30
#include <ngx_config.h>
30
31
#include <ngx_core.h>
31
32
#include <ngx_http.h>
@@ -69,6 +70,10 @@ extern int ldap_init_fd(ber_socket_t fd, int proto, const char *url, LDAP **ld);
69
70
70
71
#define NGX_HTTP_AUTH_LDAP_MAX_SERVERS_SIZE 7
71
72
73
+ #define SSL_CERT_VERIFY_OFF 0
74
+ #define SSL_CERT_VERIFY_FULL 1
75
+ #define SSL_CERT_VERIFY_CHAIN 2
76
+
72
77
73
78
typedef struct {
74
79
LDAPURLDesc * ludpp ;
@@ -431,18 +436,24 @@ ngx_http_auth_ldap_ldap_server(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
431
436
return NGX_CONF_ERROR ;
432
437
}
433
438
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
446
457
} else if (ngx_strcmp (value [0 ].data , "ssl_ca_dir" ) == 0 ) {
447
458
server -> ssl_ca_dir = value [1 ];
448
459
} 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
1334
1345
long chain_verified = SSL_get_verify_result (conn -> ssl -> connection );
1335
1346
1336
1347
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 );
1347
1372
}
1348
- addr_verified = X509_check_ip (cert , (const unsigned char * )conn -> sockaddr -> sa_data , len , 0 );
1349
1373
}
1350
1374
1351
1375
// Find anything fishy?
@@ -1528,11 +1552,11 @@ ngx_http_auth_ldap_read_handler(ngx_event_t *rev)
1528
1552
1529
1553
// if LDAP_SERVER_DOWN (usually timeouts or server disconnects)
1530
1554
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
1536
1560
**/
1537
1561
c -> server -> max_down_retries_count ++ ;
1538
1562
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)
1542
1566
// timer call to this read handler again
1543
1567
ngx_http_auth_ldap_reconnect_handler (rev );
1544
1568
return ;
1545
- }
1569
+ }
1546
1570
1547
1571
return ;
1548
1572
}
0 commit comments