kong-build-tools/openresty-patches/t/001-balancer-ssl-ctx.t (6 lines of code) (raw):

# vim:set ft= ts=4 sw=4 et fdm=marker: use Test::Nginx::Socket; repeat_each(2); plan tests => repeat_each() * (blocks() * 6 + 2); #worker_connections(1024); #no_diff(); no_long_string(); run_tests(); __DATA__ === TEST 1: not setting SSL_CTX for upstream client connection, proxy_ssl_* are respected --- http_config upstream backend { server 0.0.0.1; balancer_by_lua_block { local balancer = require("ngx.balancer") assert(balancer.set_current_peer("127.0.0.1", 12345)) } } server { listen 12345 ssl; ssl_certificate ../../certs/test.crt; ssl_certificate_key ../../certs/test.key; server_tokens off; location / { return 200 "ok"; } } --- config # default: proxy_ssl_verify off; proxy_ssl_trusted_certificate ../../certs/trusted.crt; location = /t { proxy_pass https://backend; } --- request GET /t --- response_body: ok --- error_code: 200 --- no_error_log [warn] [error] [crit] === TEST 2: set SSL_CTX for upstream client connection --- http_config upstream backend { server 0.0.0.1; balancer_by_lua_block { local http_tls = require("http.tls") local openssl_ctx = require("openssl.ssl.context") local balancer = require("ngx.balancer") local ffi = require("ffi") local cast = ffi.cast local voidpp = ffi.typeof("void**") local client_ssl_ctx = http_tls.new_client_context() -- this overrides any proxy_ssl_* configs client_ssl_ctx:setVerify(openssl_ctx.VERIFY_PEER) assert(balancer.set_ssl_ctx(cast(voidpp, client_ssl_ctx)[0])) assert(balancer.set_current_peer("127.0.0.1", 12345)) } } server { listen 12345 ssl; ssl_certificate ../../certs/test.crt; ssl_certificate_key ../../certs/test.key; server_tokens off; location = / { return 200 "ok"; } } --- config proxy_ssl_verify on; proxy_ssl_trusted_certificate ../../certs/trusted.crt; location = /t { proxy_pass https://backend; } --- request GET /t --- response_body_like: 502 Bad Gateway --- error_code: 502 --- error_log SSL_do_handshake() failed (SSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed) --- no_error_log [warn] [error] === TEST 3: set SSL_CTX for non-https upstream (skipping because set_ssl_ctx enables TLS unconditionally right now regardless of what was passed to proxy_pass) --- SKIP --- http_config upstream backend { server 0.0.0.1; balancer_by_lua_block { local http_tls = require("http.tls") local openssl_ctx = require("openssl.ssl.context") local balancer = require("ngx.balancer") local ffi = require("ffi") local cast = ffi.cast local voidpp = ffi.typeof("void**") local client_ssl_ctx = http_tls.new_client_context() -- this overrides any proxy_ssl_* configs client_ssl_ctx:setVerify(openssl_ctx.VERIFY_PEER) assert(balancer.set_ssl_ctx(cast(voidpp, client_ssl_ctx)[0])) assert(balancer.set_current_peer("127.0.0.1", 12345)) } } server { listen 12345; server_tokens off; location / { return 200 "ok"; } } --- config location = /t { proxy_pass http://backend; } --- request GET /t --- response_body: ok --- error_code: 200 --- no_error_log [warn] [error] [crit] === TEST 4: set SSL_CTX should not affect unrelated requests --- http_config lua_shared_dict flag 16k; upstream backend { server 0.0.0.1; balancer_by_lua_block { local balancer = require("ngx.balancer") if ngx.shared.flag:incr("executed", 1, 0) % 2 == 0 then assert(balancer.set_current_peer("127.0.0.1", 12346)) return end local http_tls = require("http.tls") local openssl_ctx = require("openssl.ssl.context") local ffi = require("ffi") local cast = ffi.cast local voidpp = ffi.typeof("void**") local client_ssl_ctx = http_tls.new_client_context() -- this overrides any proxy_ssl_* configs client_ssl_ctx:setVerify(openssl_ctx.VERIFY_NONE) assert(balancer.set_ssl_ctx(cast(voidpp, client_ssl_ctx)[0])) assert(balancer.set_current_peer("127.0.0.1", 12345)) } } server { listen 12345 ssl; ssl_certificate ../../certs/test.crt; ssl_certificate_key ../../certs/test.key; server_tokens off; location / { return 200 "ok"; } } server { listen 12346; server_tokens off; location / { return 200 "ok1"; } } --- config location = /t { proxy_pass https://backend; } location = /u { proxy_pass http://backend; } --- request eval ["GET /t", "GET /u"] --- response_body eval ["ok", "ok1"] --- error_code eval [200, 200] --- no_error_log [warn] [error] [crit]