Skip to content

Commit 6c25967

Browse files
committed
tests: add unit tests for client certificate verification API
1 parent abfee94 commit 6c25967

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed

t/140-ssl-c-api.t

+207
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ ffi.cdef[[
6363
void ngx_http_lua_ffi_free_priv_key(void *cdata);
6464
6565
int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);
66+
67+
int ngx_http_lua_ffi_ssl_verify_client(void *r, int depth, void *cdata, char **err);
68+
6669
]]
6770
_EOC_
6871
}
@@ -812,3 +815,207 @@ lua ssl server name: "test.com"
812815
--- no_error_log
813816
[error]
814817
[alert]
818+
819+
820+
821+
=== TEST 6: verify client with CA certificates
822+
--- http_config
823+
server {
824+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
825+
server_name test.com;
826+
827+
ssl_certificate_by_lua_block {
828+
collectgarbage()
829+
830+
require "defines"
831+
local ffi = require "ffi"
832+
833+
local errmsg = ffi.new("char *[1]")
834+
835+
local r = require "resty.core.base" .get_request()
836+
if r == nil then
837+
ngx.log(ngx.ERR, "no request found")
838+
return
839+
end
840+
841+
local f = assert(io.open("t/cert/test.crt", "rb"))
842+
local cert_data = f:read("*all")
843+
f:close()
844+
845+
local cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
846+
if not cert then
847+
ngx.log(ngx.ERR, "failed to parse PEM cert: ",
848+
ffi.string(errmsg[0]))
849+
return
850+
end
851+
852+
local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, 1, cert, errmsg)
853+
if rc ~= 0 then
854+
ngx.log(ngx.ERR, "failed to verify client: ",
855+
ffi.string(errmsg[0]))
856+
return
857+
end
858+
}
859+
860+
ssl_certificate ../../cert/test.crt;
861+
ssl_certificate_key ../../cert/test.key;
862+
863+
server_tokens off;
864+
location / {
865+
default_type 'text/plain';
866+
content_by_lua_block {
867+
print('client certificate subject: ', ngx.var.ssl_client_s_dn)
868+
ngx.say(ngx.var.ssl_client_verify)
869+
}
870+
more_clear_headers Date;
871+
}
872+
}
873+
--- config
874+
server_tokens off;
875+
lua_ssl_trusted_certificate ../../cert/test.crt;
876+
877+
location /t {
878+
proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
879+
proxy_ssl_certificate ../../cert/test.crt;
880+
proxy_ssl_certificate_key ../../cert/test.key;
881+
}
882+
883+
--- request
884+
GET /t
885+
--- response_body
886+
SUCCESS
887+
888+
--- error_log
889+
client certificate subject: [email protected],CN=test.com
890+
891+
--- no_error_log
892+
[error]
893+
[alert]
894+
895+
896+
897+
=== TEST 7: verify client without CA certificates
898+
--- http_config
899+
server {
900+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
901+
server_name test.com;
902+
903+
ssl_certificate_by_lua_block {
904+
collectgarbage()
905+
906+
require "defines"
907+
local ffi = require "ffi"
908+
909+
local errmsg = ffi.new("char *[1]")
910+
911+
local r = require "resty.core.base" .get_request()
912+
if r == nil then
913+
ngx.log(ngx.ERR, "no request found")
914+
return
915+
end
916+
917+
local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, 1, nil, errmsg)
918+
if rc ~= 0 then
919+
ngx.log(ngx.ERR, "failed to verify client: ",
920+
ffi.string(errmsg[0]))
921+
return
922+
end
923+
}
924+
925+
ssl_certificate ../../cert/test.crt;
926+
ssl_certificate_key ../../cert/test.key;
927+
928+
server_tokens off;
929+
location / {
930+
default_type 'text/plain';
931+
content_by_lua_block {
932+
print('client certificate subject: ', ngx.var.ssl_client_s_dn)
933+
ngx.say(ngx.var.ssl_client_verify)
934+
}
935+
more_clear_headers Date;
936+
}
937+
}
938+
--- config
939+
server_tokens off;
940+
lua_ssl_trusted_certificate ../../cert/test.crt;
941+
942+
location /t {
943+
proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
944+
proxy_ssl_certificate ../../cert/test.crt;
945+
proxy_ssl_certificate_key ../../cert/test.key;
946+
}
947+
948+
--- request
949+
GET /t
950+
--- response_body
951+
FAILED:self signed certificate
952+
953+
--- error_log
954+
client certificate subject: [email protected],CN=test.com
955+
956+
--- no_error_log
957+
[error]
958+
[alert]
959+
960+
961+
962+
=== TEST 8: verify client but client provides no certificate
963+
--- http_config
964+
server {
965+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
966+
server_name test.com;
967+
968+
ssl_certificate_by_lua_block {
969+
collectgarbage()
970+
971+
require "defines"
972+
local ffi = require "ffi"
973+
974+
local errmsg = ffi.new("char *[1]")
975+
976+
local r = require "resty.core.base" .get_request()
977+
if r == nil then
978+
ngx.log(ngx.ERR, "no request found")
979+
return
980+
end
981+
982+
local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, 1, nil, errmsg)
983+
if rc ~= 0 then
984+
ngx.log(ngx.ERR, "failed to verify client: ",
985+
ffi.string(errmsg[0]))
986+
return
987+
end
988+
}
989+
990+
ssl_certificate ../../cert/test.crt;
991+
ssl_certificate_key ../../cert/test.key;
992+
993+
server_tokens off;
994+
location / {
995+
default_type 'text/plain';
996+
content_by_lua_block {
997+
print('client certificate subject: ', ngx.var.ssl_client_s_dn)
998+
ngx.say(ngx.var.ssl_client_verify)
999+
}
1000+
more_clear_headers Date;
1001+
}
1002+
}
1003+
--- config
1004+
server_tokens off;
1005+
lua_ssl_trusted_certificate ../../cert/test.crt;
1006+
1007+
location /t {
1008+
proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
1009+
}
1010+
1011+
--- request
1012+
GET /t
1013+
--- response_body
1014+
NONE
1015+
1016+
--- error_log
1017+
client certificate subject: nil
1018+
1019+
--- no_error_log
1020+
[error]
1021+
[alert]

0 commit comments

Comments
 (0)