Skip to content

Commit 60c5fe6

Browse files
committed
tests: add unit tests for client certificate verification API
1 parent c00d686 commit 60c5fe6

File tree

1 file changed

+177
-0
lines changed

1 file changed

+177
-0
lines changed

t/140-ssl-c-api.t

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ ffi.cdef[[
6161
void ngx_stream_lua_ffi_free_priv_key(void *cdata);
6262
6363
int ngx_stream_lua_ffi_ssl_clear_certs(void *r, char **err);
64+
65+
int ngx_stream_lua_ffi_ssl_verify_client(void *r, int depth, void *cdata, char **err);
66+
6467
]]
6568
_EOC_
6669
}
@@ -675,3 +678,177 @@ lua ssl server name: "test.com"
675678
--- no_error_log
676679
[error]
677680
[alert]
681+
682+
683+
684+
=== TEST 6: verify client with CA certificates
685+
--- stream_config
686+
server {
687+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
688+
689+
ssl_certificate ../../cert/test2.crt;
690+
ssl_certificate_key ../../cert/test2.key;
691+
692+
ssl_certificate_by_lua_block {
693+
collectgarbage()
694+
695+
local ffi = require "ffi"
696+
require "defines"
697+
698+
local errmsg = ffi.new("char *[1]")
699+
700+
local r = require "resty.core.base" .get_request()
701+
if not r then
702+
ngx.log(ngx.ERR, "no request found")
703+
return
704+
end
705+
706+
local f = assert(io.open("t/cert/test.crt", "rb"))
707+
local cert_data = f:read("*all")
708+
f:close()
709+
710+
local cert = ffi.C.ngx_stream_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
711+
if not cert then
712+
ngx.log(ngx.ERR, "failed to parse PEM cert: ",
713+
ffi.string(errmsg[0]))
714+
return
715+
end
716+
717+
local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, 1, cert, errmsg)
718+
if rc ~= 0 then
719+
ngx.log(ngx.ERR, "failed to set cdata cert: ",
720+
ffi.string(errmsg[0]))
721+
return
722+
end
723+
}
724+
725+
content_by_lua_block {
726+
print('client certificate subject: ', ngx.var.ssl_client_s_dn)
727+
ngx.say(ngx.var.ssl_client_verify)
728+
}
729+
}
730+
--- stream_server_config
731+
lua_ssl_trusted_certificate ../../cert/test.crt;
732+
733+
proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
734+
proxy_ssl on;
735+
proxy_ssl_certificate ../../cert/test.crt;
736+
proxy_ssl_certificate_key ../../cert/test.key;
737+
738+
--- stream_response
739+
SUCCESS
740+
741+
--- error_log
742+
client certificate subject: [email protected],CN=test.com
743+
744+
--- no_error_log
745+
[error]
746+
[alert]
747+
748+
749+
750+
=== TEST 7: verify client without CA certificates
751+
--- stream_config
752+
server {
753+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
754+
755+
ssl_certificate ../../cert/test2.crt;
756+
ssl_certificate_key ../../cert/test2.key;
757+
758+
ssl_certificate_by_lua_block {
759+
collectgarbage()
760+
761+
local ffi = require "ffi"
762+
require "defines"
763+
764+
local errmsg = ffi.new("char *[1]")
765+
766+
local r = require "resty.core.base" .get_request()
767+
if not r then
768+
ngx.log(ngx.ERR, "no request found")
769+
return
770+
end
771+
772+
local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, 1, nil, errmsg)
773+
if rc ~= 0 then
774+
ngx.log(ngx.ERR, "failed to set cdata cert: ",
775+
ffi.string(errmsg[0]))
776+
return
777+
end
778+
}
779+
780+
content_by_lua_block {
781+
print('client certificate subject: ', ngx.var.ssl_client_s_dn)
782+
ngx.say(ngx.var.ssl_client_verify)
783+
}
784+
}
785+
--- stream_server_config
786+
lua_ssl_trusted_certificate ../../cert/test.crt;
787+
788+
proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
789+
proxy_ssl on;
790+
proxy_ssl_certificate ../../cert/test.crt;
791+
proxy_ssl_certificate_key ../../cert/test.key;
792+
793+
--- stream_response
794+
FAILED:self signed certificate
795+
796+
--- error_log
797+
client certificate subject: [email protected],CN=test.com
798+
799+
--- no_error_log
800+
[error]
801+
[alert]
802+
803+
804+
805+
=== TEST 8: verify client but client provides no certificate
806+
--- stream_config
807+
server {
808+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
809+
810+
ssl_certificate ../../cert/test2.crt;
811+
ssl_certificate_key ../../cert/test2.key;
812+
813+
ssl_certificate_by_lua_block {
814+
collectgarbage()
815+
816+
local ffi = require "ffi"
817+
require "defines"
818+
819+
local errmsg = ffi.new("char *[1]")
820+
821+
local r = require "resty.core.base" .get_request()
822+
if not r then
823+
ngx.log(ngx.ERR, "no request found")
824+
return
825+
end
826+
827+
local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, 1, nil, errmsg)
828+
if rc ~= 0 then
829+
ngx.log(ngx.ERR, "failed to set cdata cert: ",
830+
ffi.string(errmsg[0]))
831+
return
832+
end
833+
}
834+
835+
content_by_lua_block {
836+
print('client certificate subject: ', ngx.var.ssl_client_s_dn)
837+
ngx.say(ngx.var.ssl_client_verify)
838+
}
839+
}
840+
--- stream_server_config
841+
lua_ssl_trusted_certificate ../../cert/test.crt;
842+
843+
proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
844+
proxy_ssl on;
845+
846+
--- stream_response
847+
NONE
848+
849+
--- error_log
850+
client certificate subject: nil
851+
852+
--- no_error_log
853+
[error]
854+
[alert]

0 commit comments

Comments
 (0)