@@ -63,6 +63,9 @@ ffi.cdef[[
63
63
void ngx_http_lua_ffi_free_priv_key(void *cdata);
64
64
65
65
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
+
66
69
]]
67
70
_EOC_
68
71
}
@@ -812,3 +815,207 @@ lua ssl server name: "test.com"
812
815
--- no_error_log
813
816
[error]
814
817
[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