@@ -12,7 +12,7 @@ if ($openssl_version =~ m/built with OpenSSL (0|1\.0\.(?:0|1[^\d]|2[a-d]).*)/) {
12
12
plan(skip_all => " too old OpenSSL, need 1.0.2e, was $1 " );
13
13
14
14
} else {
15
- plan tests => repeat_each() * (blocks() * 5 + 1);
15
+ plan tests => repeat_each() * (blocks() * 5 - 1);
16
16
}
17
17
18
18
$ENV {TEST_NGINX_HTML_DIR } ||= html_dir();
@@ -72,7 +72,7 @@ ffi.cdef[[
72
72
void ngx_http_lua_ffi_free_priv_key(void *cdata);
73
73
74
74
int ngx_http_lua_ffi_ssl_verify_client(void *r, void *cdata,
75
- int depth, char **err);
75
+ void *cdata, int depth, char **err);
76
76
77
77
int ngx_http_lua_ffi_ssl_client_random(ngx_http_request_t *r,
78
78
unsigned char *out, size_t *outlen, char **err);
@@ -853,21 +853,21 @@ lua ssl server name: "test.com"
853
853
local cert_data = f:read("*all")
854
854
f:close()
855
855
856
- local cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
857
- if not cert then
858
- ngx.log(ngx.ERR, "failed to parse PEM cert: ",
856
+ local client_cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
857
+ if not client_cert then
858
+ ngx.log(ngx.ERR, "failed to parse PEM client cert: ",
859
859
ffi.string(errmsg[0]))
860
860
return
861
861
end
862
862
863
- local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, cert , 1, errmsg)
863
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, client_cert, nil , 1, errmsg)
864
864
if rc ~= 0 then
865
865
ngx.log(ngx.ERR, "failed to verify client: ",
866
866
ffi.string(errmsg[0]))
867
867
return
868
868
end
869
869
870
- ffi.C.ngx_http_lua_ffi_free_cert(cert )
870
+ ffi.C.ngx_http_lua_ffi_free_cert(client_cert )
871
871
}
872
872
873
873
ssl_certificate ../../cert/test2.crt;
924
924
return
925
925
end
926
926
927
- local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, nil, -1, errmsg)
927
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, nil, nil, -1, errmsg)
928
928
if rc ~= 0 then
929
929
ngx.log(ngx.ERR, "failed to verify client: ",
930
930
ffi.string(errmsg[0]))
990
990
local cert_data = f:read("*all")
991
991
f:close()
992
992
993
- local cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
994
- if not cert then
995
- ngx.log(ngx.ERR, "failed to parse PEM cert: ",
993
+ local client_cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
994
+ if not client_cert then
995
+ ngx.log(ngx.ERR, "failed to parse PEM client cert: ",
996
996
ffi.string(errmsg[0]))
997
997
return
998
998
end
999
999
1000
- local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, cert , 1, errmsg)
1000
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, client_cert, nil , 1, errmsg)
1001
1001
if rc ~= 0 then
1002
1002
ngx.log(ngx.ERR, "failed to verify client: ",
1003
1003
ffi.string(errmsg[0]))
1004
1004
return
1005
1005
end
1006
1006
1007
- ffi.C.ngx_http_lua_ffi_free_cert(cert )
1007
+ ffi.C.ngx_http_lua_ffi_free_cert(client_cert )
1008
1008
}
1009
1009
1010
1010
ssl_certificate ../../cert/test2.crt;
@@ -1623,3 +1623,157 @@ lua ssl server name: "test.com"
1623
1623
--- no_error_log
1624
1624
[error]
1625
1625
[alert]
1626
+
1627
+
1628
+
1629
+ === TEST 13: verify client, but server don't trust root ca
1630
+ --- http_config
1631
+ server {
1632
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1633
+ server_name example.com;
1634
+
1635
+ ssl_certificate_by_lua_block {
1636
+ collectgarbage()
1637
+
1638
+ require "defines"
1639
+ local ffi = require "ffi"
1640
+
1641
+ local errmsg = ffi.new("char *[1]")
1642
+
1643
+ local r = require "resty.core.base" .get_request()
1644
+ if r == nil then
1645
+ ngx.log(ngx.ERR, "no request found")
1646
+ return
1647
+ end
1648
+
1649
+ local f = assert(io.open("t/cert/mtls_server.crt", "rb"))
1650
+ local cert_data = f:read("*all")
1651
+ f:close()
1652
+
1653
+ local client_cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
1654
+ if not client_cert then
1655
+ ngx.log(ngx.ERR, "failed to parse PEM client cert: ",
1656
+ ffi.string(errmsg[0]))
1657
+ return
1658
+ end
1659
+
1660
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, client_cert, nil, 2, errmsg)
1661
+ if rc ~= 0 then
1662
+ ngx.log(ngx.ERR, "failed to verify client: ",
1663
+ ffi.string(errmsg[0]))
1664
+ return
1665
+ end
1666
+
1667
+ ffi.C.ngx_http_lua_ffi_free_cert(client_cert)
1668
+ }
1669
+
1670
+ ssl_certificate ../../cert/mtls_server.crt;
1671
+ ssl_certificate_key ../../cert/mtls_server.key;
1672
+
1673
+ location / {
1674
+ default_type 'text/plain';
1675
+ content_by_lua_block {
1676
+ ngx.say(ngx.var.ssl_client_verify)
1677
+ }
1678
+ more_clear_headers Date;
1679
+ }
1680
+ }
1681
+ --- config
1682
+ location /t {
1683
+ proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
1684
+ proxy_ssl_certificate ../../cert/mtls_client.crt;
1685
+ proxy_ssl_certificate_key ../../cert/mtls_client.key;
1686
+ proxy_ssl_session_reuse off;
1687
+ }
1688
+
1689
+ --- request
1690
+ GET /t
1691
+ --- response_body
1692
+ FAILED:unable to verify the first certificate
1693
+
1694
+ --- no_error_log
1695
+ [error]
1696
+ [alert]
1697
+
1698
+
1699
+
1700
+ === TEST 14: verify client and server trust root ca
1701
+ --- http_config
1702
+ server {
1703
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1704
+ server_name example.com;
1705
+
1706
+ ssl_certificate_by_lua_block {
1707
+ collectgarbage()
1708
+
1709
+ require "defines"
1710
+ local ffi = require "ffi"
1711
+
1712
+ local errmsg = ffi.new("char *[1]")
1713
+
1714
+ local r = require "resty.core.base" .get_request()
1715
+ if r == nil then
1716
+ ngx.log(ngx.ERR, "no request found")
1717
+ return
1718
+ end
1719
+
1720
+ local f = assert(io.open("t/cert/mtls_server.crt", "rb"))
1721
+ local cert_data = f:read("*all")
1722
+ f:close()
1723
+
1724
+ local client_cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
1725
+ if not client_cert then
1726
+ ngx.log(ngx.ERR, "failed to parse PEM client cert: ",
1727
+ ffi.string(errmsg[0]))
1728
+ return
1729
+ end
1730
+
1731
+ local f = assert(io.open("t/cert/mtls_ca.crt", "rb"))
1732
+ local cert_data = f:read("*all")
1733
+ f:close()
1734
+
1735
+ local trusted_cert = ffi.C.ngx_http_lua_ffi_parse_pem_cert(cert_data, #cert_data, errmsg)
1736
+ if not trusted_cert then
1737
+ ngx.log(ngx.ERR, "failed to parse PEM trusted cert: ",
1738
+ ffi.string(errmsg[0]))
1739
+ return
1740
+ end
1741
+
1742
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_verify_client(r, cert, trusted_cert, 2, errmsg)
1743
+ if rc ~= 0 then
1744
+ ngx.log(ngx.ERR, "failed to verify client: ",
1745
+ ffi.string(errmsg[0]))
1746
+ return
1747
+ end
1748
+
1749
+ ffi.C.ngx_http_lua_ffi_free_cert(client_cert)
1750
+ ffi.C.ngx_http_lua_ffi_free_cert(trusted_cert)
1751
+ }
1752
+
1753
+ ssl_certificate ../../cert/mtls_server.crt;
1754
+ ssl_certificate_key ../../cert/mtls_server.key;
1755
+
1756
+ location / {
1757
+ default_type 'text/plain';
1758
+ content_by_lua_block {
1759
+ ngx.say(ngx.var.ssl_client_verify)
1760
+ }
1761
+ more_clear_headers Date;
1762
+ }
1763
+ }
1764
+ --- config
1765
+ location /t {
1766
+ proxy_pass https://unix:$TEST_NGINX_HTML_DIR/nginx.sock;
1767
+ proxy_ssl_certificate ../../cert/mtls_client.crt;
1768
+ proxy_ssl_certificate_key ../../cert/mtls_client.key;
1769
+ proxy_ssl_session_reuse off;
1770
+ }
1771
+
1772
+ --- request
1773
+ GET /t
1774
+ --- response_body
1775
+ SUCCESS
1776
+
1777
+ --- no_error_log
1778
+ [error]
1779
+ [alert]
0 commit comments