@@ -61,6 +61,9 @@ ffi.cdef[[
61
61
void ngx_stream_lua_ffi_free_priv_key(void *cdata);
62
62
63
63
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
+
64
67
]]
65
68
_EOC_
66
69
}
@@ -675,3 +678,177 @@ lua ssl server name: "test.com"
675
678
--- no_error_log
676
679
[error]
677
680
[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