@@ -63,6 +63,10 @@ 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, void *cdata,
68
+ int depth, char **err);
69
+
66
70
]]
67
71
_EOC_
68
72
}
@@ -812,3 +816,213 @@ lua ssl server name: "test.com"
812
816
--- no_error_log
813
817
[error]
814
818
[alert]
819
+
820
+
821
+
822
+ === TEST 6: verify client with CA certificates
823
+ --- http_config
824
+ server {
825
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
826
+ server_name test.com;
827
+
828
+ ssl_certificate_by_lua_block {
829
+ collectgarbage()
830
+
831
+ require "defines"
832
+ local ffi = require "ffi"
833
+
834
+ local errmsg = ffi.new("char *[1]")
835
+
836
+ local r = require "resty.core.base" .get_request()
837
+ if r == nil then
838
+ ngx.log(ngx.ERR, "no request found")
839
+ return
840
+ end
841
+
842
+ local f = assert(io.open("t/cert/test.crt", "rb"))
843
+ local cert_data = f:read("*all")
844
+ f:close()
845
+
846
+ local cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
847
+ if not cert then
848
+ ngx.log(ngx.ERR, "failed to parse PEM cert: ",
849
+ ffi.string(errmsg[0]))
850
+ return
851
+ end
852
+
853
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, cert, 1, errmsg)
854
+ if rc ~= 0 then
855
+ ngx.log(ngx.ERR, "failed to verify client: ",
856
+ ffi.string(errmsg[0]))
857
+ return
858
+ end
859
+
860
+ ffi.C.ngx_http_lua_ffi_free_cert(cert)
861
+ }
862
+
863
+ ssl_certificate ../../cert/test2.crt;
864
+ ssl_certificate_key ../../cert/test2.key;
865
+
866
+ location / {
867
+ default_type 'text/plain';
868
+ content_by_lua_block {
869
+ print('client certificate subject: ', ngx.var.ssl_client_s_dn)
870
+ ngx.say(ngx.var.ssl_client_verify)
871
+ }
872
+ more_clear_headers Date;
873
+ }
874
+ }
875
+ --- config
876
+ location /t {
877
+ proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
878
+ proxy_ssl_certificate ../../cert/test.crt;
879
+ proxy_ssl_certificate_key ../../cert/test.key;
880
+ proxy_ssl_session_reuse off;
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, nil, -1, 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/test2.crt;
926
+ ssl_certificate_key ../../cert/test2.key;
927
+
928
+ location / {
929
+ default_type 'text/plain';
930
+ content_by_lua_block {
931
+ print('client certificate subject: ', ngx.var.ssl_client_s_dn)
932
+ ngx.say(ngx.var.ssl_client_verify)
933
+ }
934
+ more_clear_headers Date;
935
+ }
936
+ }
937
+ --- config
938
+ location /t {
939
+ proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
940
+ proxy_ssl_certificate ../../cert/test.crt;
941
+ proxy_ssl_certificate_key ../../cert/test.key;
942
+ proxy_ssl_session_reuse off;
943
+ }
944
+
945
+ --- request
946
+ GET /t
947
+ --- response_body
948
+ FAILED:self signed certificate
949
+
950
+ --- error_log
951
+ client certificate subject: [email protected] ,CN=test.com
952
+
953
+ --- no_error_log
954
+ [error]
955
+ [alert]
956
+
957
+
958
+
959
+ === TEST 8: verify client but client provides no certificate
960
+ --- http_config
961
+ server {
962
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
963
+ server_name test.com;
964
+
965
+ ssl_certificate_by_lua_block {
966
+ collectgarbage()
967
+
968
+ require "defines"
969
+ local ffi = require "ffi"
970
+
971
+ local errmsg = ffi.new("char *[1]")
972
+
973
+ local r = require "resty.core.base" .get_request()
974
+ if r == nil then
975
+ ngx.log(ngx.ERR, "no request found")
976
+ return
977
+ end
978
+
979
+ local f = assert(io.open("t/cert/test.crt", "rb"))
980
+ local cert_data = f:read("*all")
981
+ f:close()
982
+
983
+ local cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
984
+ if not cert then
985
+ ngx.log(ngx.ERR, "failed to parse PEM cert: ",
986
+ ffi.string(errmsg[0]))
987
+ return
988
+ end
989
+
990
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, cert, 1, errmsg)
991
+ if rc ~= 0 then
992
+ ngx.log(ngx.ERR, "failed to verify client: ",
993
+ ffi.string(errmsg[0]))
994
+ return
995
+ end
996
+
997
+ ffi.C.ngx_http_lua_ffi_free_cert(cert)
998
+ }
999
+
1000
+ ssl_certificate ../../cert/test2.crt;
1001
+ ssl_certificate_key ../../cert/test2.key;
1002
+
1003
+ location / {
1004
+ default_type 'text/plain';
1005
+ content_by_lua_block {
1006
+ print('client certificate subject: ', ngx.var.ssl_client_s_dn)
1007
+ ngx.say(ngx.var.ssl_client_verify)
1008
+ }
1009
+ more_clear_headers Date;
1010
+ }
1011
+ }
1012
+ --- config
1013
+ location /t {
1014
+ proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
1015
+ proxy_ssl_session_reuse off;
1016
+ }
1017
+
1018
+ --- request
1019
+ GET /t
1020
+ --- response_body
1021
+ NONE
1022
+
1023
+ --- error_log
1024
+ client certificate subject: nil
1025
+
1026
+ --- no_error_log
1027
+ [error]
1028
+ [alert]
0 commit comments