@@ -22,6 +22,15 @@ check_accum_error_log();
2222no_long_string();
2323# no_diff();
2424
25+ sub read_file {
26+ my $ infile = shift ;
27+ open my $ in , $ infile
28+ or die " cannot open $ infile for reading: $!" ;
29+ my $ cert = do { local $/ ; <$in > };
30+ close $ in ;
31+ $ cert ;
32+ }
33+
2534run_tests();
2635
2736__DATA__
@@ -2056,3 +2065,129 @@ GET /c
20562065failed to receive: failed to receive the first 2 bytes : closed
20572066-- - error_log
20582067failed to send close : bad status code
2068+
2069+
2070+
2071+ === TEST 29 : mutual TLS with client certs
2072+ -- - no_check_leak
2073+ -- - http_config eval: $::HttpConfig
2074+ -- - config
2075+ listen $ TEST_NGINX_RAND_PORT_1 ssl;
2076+ server_name test. com;
2077+ ssl_certificate .. / .. / cert/ mtls_server. crt;
2078+ ssl_certificate_key .. / .. / cert/ mtls_server. key ;
2079+ ssl_client_certificate .. / .. / cert/ mtls_ca. crt;
2080+ ssl_verify_client on;
2081+ server_tokens off;
2082+
2083+ resolver 127.0 . 0. 1: 1953 ipv6= off;
2084+ resolver_timeout 1 s;
2085+
2086+ lua_ssl_trusted_certificate .. / .. / cert/ mtls_ca. crt;
2087+ lua_ssl_verify_depth 2 ;
2088+
2089+ location = /c {
2090+ content_by_lua_block {
2091+ local ssl = require " ngx.ssl"
2092+ local f = assert(io. open (' t/cert/mtls_client.crt' ))
2093+ local cert_data = f: read(" *a" )
2094+ f: close()
2095+
2096+ f = assert(io. open (' t/cert/mtls_client.key' ))
2097+ local key_data = f: read(" *a" )
2098+ f: close()
2099+
2100+ local chain = assert(ssl. parse_pem_cert(cert_data))
2101+ local priv = assert(ssl. parse_pem_priv_key(key_data))
2102+
2103+ local client = require " resty.websocket.client"
2104+ local wb, err = client: new()
2105+
2106+ local uri = " wss://test.com:$ TEST_NGINX_RAND_PORT_1 /s"
2107+ local ok , err = wb: connect(uri, {ssl_verify = true, client_cert = chain, client_priv_key = priv})
2108+ if not ok then
2109+ ngx. say (" failed to connect: " .. err)
2110+ return
2111+ end
2112+
2113+ local data = " hello"
2114+ local bytes , err = wb: send_text(data)
2115+ if not bytes then
2116+ ngx. say (" failed to send frame: " , err)
2117+ return
2118+ end
2119+
2120+ local typ
2121+ data, typ, err = wb: recv_frame()
2122+ if not data then
2123+ ngx. say (" failed to receive 2nd frame: " , err)
2124+ return
2125+ end
2126+
2127+ ngx. say (" received: " , data, " (" , typ, " )" )
2128+
2129+ local ok , err = wb: close()
2130+ if not ok then
2131+ ngx. say (" failed to close conn: " , err)
2132+ return
2133+ end
2134+ }
2135+ }
2136+
2137+ location = /s {
2138+ content_by_lua '
2139+ local server = require "resty.websocket.server"
2140+ local wb, err = server:new()
2141+ if not wb then
2142+ ngx.log(ngx.ERR, "failed to new websocket: ", err)
2143+ return ngx.exit(444)
2144+ end
2145+
2146+ local data, typ, err = wb:recv_frame()
2147+ if not data then
2148+ -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)
2149+ return ngx.exit(444)
2150+ end
2151+
2152+ -- send it back!
2153+ local bytes, err = wb:send_text(data)
2154+ if not bytes then
2155+ ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)
2156+ return ngx.exit(444)
2157+ end
2158+ ' ;
2159+ }
2160+ -- - udp_listen: 1953
2161+ -- - udp_reply eval
2162+ sub {
2163+ # Get DNS request ID from passed UDP datagram
2164+ my $ dns_id = unpack (" n" , shift );
2165+ # Set name and encode it
2166+ my $ name = " test.com" ;
2167+ $ name =~ s /([^. ]+ )\.? /chr (length($1 )) . $1 / ge ;
2168+ $ name .= " \0" ;
2169+ my $ s = ' ' ;
2170+ $ s .= pack (" n" , $ dns_id );
2171+ # DNS response flags, hardcoded
2172+ my $ flags = (1 << 15 ) + (0 << 11 ) + (0 << 10 ) + (0 << 9 ) + (1 << 8 ) + (1 << 7 ) + 0 ;
2173+ $ flags = pack (" n" , $ flags );
2174+ $ s .= $ flags ;
2175+ $ s .= pack (" nnnn" , 1 , 1 , 0 , 0 );
2176+ $ s .= $ name ;
2177+ $ s .= pack (" nn" , 1 , 1 );
2178+ # Set response address and pack it
2179+ my @ addr = split / \./ , " 127.0.0.1" ;
2180+ my $ data = pack (" CCCC" , @ addr );
2181+ $ s .= $ name . pack (" nnNn" , 1 , 1 , 1 , 4 ) . $ data ;
2182+ return $ s ;
2183+ }
2184+ -- - request
2185+ GET / c
2186+ -- - response_body
2187+ received: hello (text)
2188+
2189+ -- - no_error_log
2190+ [error]
2191+ [warn ]
2192+
2193+ -- - timeout: 10
0 commit comments