@@ -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, void *cdata, int depth, char **err);
66
+
64
67
]]
65
68
_EOC_
66
69
}
@@ -675,3 +678,189 @@ 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, cert, -1, 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
+ ffi.C.ngx_stream_lua_ffi_free_cert(cert)
725
+ }
726
+
727
+ content_by_lua_block {
728
+ print('client certificate subject: ', ngx.var.ssl_client_s_dn)
729
+ ngx.say(ngx.var.ssl_client_verify)
730
+ }
731
+ }
732
+ --- stream_server_config
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
+ proxy_ssl_session_reuse off;
738
+
739
+ --- stream_response
740
+ SUCCESS
741
+
742
+ --- error_log
743
+ client certificate subject: [email protected] ,CN=test.com
744
+
745
+ --- no_error_log
746
+ [error]
747
+ [alert]
748
+
749
+
750
+
751
+ === TEST 7: verify client without CA certificates
752
+ --- stream_config
753
+ server {
754
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
755
+
756
+ ssl_certificate ../../cert/test2.crt;
757
+ ssl_certificate_key ../../cert/test2.key;
758
+
759
+ ssl_certificate_by_lua_block {
760
+ collectgarbage()
761
+
762
+ local ffi = require "ffi"
763
+ require "defines"
764
+
765
+ local errmsg = ffi.new("char *[1]")
766
+
767
+ local r = require "resty.core.base" .get_request()
768
+ if not r then
769
+ ngx.log(ngx.ERR, "no request found")
770
+ return
771
+ end
772
+
773
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, nil, -1, errmsg)
774
+ if rc ~= 0 then
775
+ ngx.log(ngx.ERR, "failed to set cdata cert: ",
776
+ ffi.string(errmsg[0]))
777
+ return
778
+ end
779
+ }
780
+
781
+ content_by_lua_block {
782
+ print('client certificate subject: ', ngx.var.ssl_client_s_dn)
783
+ ngx.say(ngx.var.ssl_client_verify)
784
+ }
785
+ }
786
+ --- stream_server_config
787
+ proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
788
+ proxy_ssl on;
789
+ proxy_ssl_certificate ../../cert/test.crt;
790
+ proxy_ssl_certificate_key ../../cert/test.key;
791
+ proxy_ssl_session_reuse off;
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 f = assert(io.open("t/cert/test.crt", "rb"))
828
+ local cert_data = f:read("*all")
829
+ f:close()
830
+
831
+ local cert = ffi.C.ngx_stream_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
832
+ if not cert then
833
+ ngx.log(ngx.ERR, "failed to parse PEM cert: ",
834
+ ffi.string(errmsg[0]))
835
+ return
836
+ end
837
+
838
+ local rc = ffi.C.ngx_stream_lua_ffi_ssl_verify_client(r, cert, 1, errmsg)
839
+ if rc ~= 0 then
840
+ ngx.log(ngx.ERR, "failed to set cdata cert: ",
841
+ ffi.string(errmsg[0]))
842
+ return
843
+ end
844
+
845
+ ffi.C.ngx_stream_lua_ffi_free_cert(cert)
846
+ }
847
+
848
+ content_by_lua_block {
849
+ print('client certificate subject: ', ngx.var.ssl_client_s_dn)
850
+ ngx.say(ngx.var.ssl_client_verify)
851
+ }
852
+ }
853
+ --- stream_server_config
854
+ proxy_pass unix:$TEST_NGINX_HTML_DIR/nginx.sock;
855
+ proxy_ssl on;
856
+ proxy_ssl_session_reuse off;
857
+
858
+ --- stream_response
859
+ NONE
860
+
861
+ --- error_log
862
+ client certificate subject: nil
863
+
864
+ --- no_error_log
865
+ [error]
866
+ [alert]
0 commit comments